타임리프
237
작성한 질문수 31
타임리프를 배우고 웹 개발시 header.html, footer.html을 나눠서 작성하고 있습니다.
예를 들어 유저의 개인정보를 변경하는 페이지(profile.html)는 관련 Contoller에서 user의 id를 넘겨서 뿌려줘서 잘 작동하는데
문제는 header.html에서 사용하는 user의 id입니다.
예를 들어header.html에 메뉴바가 있어서 해당 아이콘을 누르면 user의 id를 실어서 profile.html로 넘어가게끔 해야하는데 id를 어디서 받아와야하는지 모르겠습니다.
Controller
@Controller
public class BasicController {
@GetMapping("/layout/header")
public String userInfo(@AuthenticationPrincipal PrincipalDetails principalDetails, Model model) {
model.addAttribute("user.", "principalDetails.getUser()");
return "layout/header";
}
}<nav class="navi">
<ul class="navi-list">
<li class="navi-item"> <a th:href="@{/user/{id}(id = ${user.id})}"></a></li>
</ul>
</nav>[[ 에러내용은 ]]
Exception evaluating SpringEL expression: "user.id" (template: "/layout/header" - line 43, col 32)
Property or field 'id' cannot be found on null
코드를 어떻게 작성해야하는지 모르겠습니다. 아래와 같은 방법으로도 안 되어서 갈피를 못 잡겠습니다.
<a th:href="'/user/' + ${user.id}">
답변 1
2
안녕하세요. hwanghsp님, 공식 서포터즈 David입니다.
모델 속성의 key로 'user.' (점 포함)을 작성하셨는데 .(점)을 빼보시고 다시 시도해보시겠어요?
감사합니다.
0
profile.html을 호출하는 핸들러에 (header.html와 profile.html에 쓰일) 세션(principalDetails.getUser())을 담아서 보냈습니다. (다른 곳에서 세션id는 principalDetails.getUser().getId() 하면 나왔습니다 )
보낼 때 principalDetails.getUser().getId() 이렇게도 해봤는데 안되었습니다.
@RequiredArgsConstructor
@Controller
public class UserController {
private final UserService userService;
@GetMapping("/user/{pageUserId}")
public String popular(@PathVariable int pageUserId, Model model, @AuthenticationPrincipal PrincipalDetails principalDetails) {
model.addAttribute("principal", principalDetails.getUser());
return "/user/profile";
}
그후 이제 .html에서 가져다 써야 하는데
다른 것들은 다 불러 왔는데 id가 안들어가네요, 말씀주신 [header fragment 내 불러올 수 있는 방법] 알 수 있을까요?
header.html
<nav th:object="${principal}"> 이렇게도 해봤는데 안됩니다.
id를 써야될 부분은)
<a th:href="@{/user/{id}(id = ${principal?.id})}"><!DOCTYPE html>
<html th:fragment="header" xmlns:th="http://www.thymeleaf.org" >
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>
</head>
<body>
<header class="header">
<div class="container">
<a th:href="@{/image/story}" class="logo">
<img th:src="@{/images/logo.png}" alt="">
</a>
<nav class="navi">
<ul class="navi-list">
<li class="navi-item"><a th:href="@{/image/story}">
<i class="fas fa-home"></i>
</a></li>
<li class="navi-item"><a th:href="@{/image/popular}">
<i class="far fa-compass"></i>
</a></li>
<li class="navi-item"><a th:href="@{/user/{id}(id = ${principal?.id})}">
<i class="far fa-user"></i>
</a></li>
</ul>
</nav>
</div>
</header>
</body>
</html>
0
지금 header.html에 profile.html은 무조건 1로 가게 해둬서 다른 id로 로그인시 에러발생합니다.
<li class="navi-item"><a th:href="@{/user/1}">
해당 컨트롤러 내에서 이렇게 찍어보았을 때 콘솔 내용 입니다.
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++");
System.out.println("dto: " + dto);
System.out.println("principalId: " + principalDetails.getUser().getId());
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++");
콘솔

해당 User.java:17과 Image.java:18은 도메인 위의 @Data 입니다.
0
현재 profile을 호출하는 핸들러에서 model에 user id를 담았더니 profile.html에서 사용가능함을 확인했습니다. (로그인한 아이디 : principalDetails.getUser().getId())
Controller
model.addAttribute("principalId", principalDetails.getUser().getId());
return "/user/profile";
profile.html
<button th:onclick="'profileImageUpload(' + ${dto.user.id} + ', ' + ${principalId} + ')'">사진 업로드</button>
여기서 어떻게 하면 header fragment 내에서 불러와서 쓸 수있나요?
이미지 업로드와 db 트랜잭션 묶는법
0
71
1
Could not resolve org.springframework.boot:spring-boot-starter-validation:2.4.4
0
93
2
MessageSourceTest 코드
0
68
1
인터셉터 에러 설정
0
70
1
resolveArgument()메서드 질문
0
72
1
43강 검증1 에서 실패 로직 관련 질문있습니다.
0
82
2
타임리프 3.X 버전 rendering, serializer 에러 해결 방법
2
162
3
스프링 빈에 등록이 안되는거 같은데 어떻게 하면 좋을까요?ㅠㅠ
0
124
3
pdf 오타 문의
0
66
1
ItemUpdateForm 검증 관련 질문입니다.
0
62
1
22page 링크 주소 변경
0
71
2
특정 데이터와 파일을 함께 저장 시, 테이블 구조 질문
0
61
1
섹션3번 수업에 대한 질문입니다.
0
99
2
@Autowired 보다 더 좋은 방법이 어떤 걸까요?
0
99
2
타입컨버터 가 람다랑 비슷해 보이는데 저의 생각이 맞는지?.
0
83
1
자바스크립트 인라인에서 객체 직렬화 시 오류가 납니다
0
159
3
스프링부트 - 오류페이지2 에서 500.html 에서 쓰인 객체 질문
0
82
1
톰캣 에러 페이지가 안보입니다.
0
121
2
apiEceptionController에서 센드 에러 호출하면 안되는지?
0
92
1
세션 타임아웃시 쿠키 삭제 방법이 없나요?
0
138
2
ApiExceptionController 질문드립니다.
0
72
1
셀렉박스 챕터에서 option value에 ==배송 방식 선택== 이것을 넣은 이유가 궁금함, 이렇게 구상해도 되는지?
0
69
1
MemberRepository 필드의 fianl 선언 유무
0
93
2
혹시 index.html 에서는 fragment 사용이 안되는건가요
0
64
1





