마이페이지의 회원 정보를 미리 로딩하고, 수정 사항이 있으면 바로 POST 요청을 보내기 위해서
UpdateForm.class를 만들어 model Attribute에 매핑하고, form의 th:object로 매핑했다.
MyPageController.class
@GetMapping(value = "/myInfo")
public String myInfo(@AuthenticationPrincipal LoginUserDetails member, Model model) {
if(member==null) return "redirect:/members/login";
Member findMember = memberService.findUser(member.getUsername());
UpdateForm updateForm = new UpdateForm(findMember);
model.addAttribute("updateForm", updateForm);
model.addAttribute("name", findMember.getName());
return "/user/userinfo/myInfo";
}
@PostMapping(value = "/updateUserInfo")
public String updateUserInfo(@AuthenticationPrincipal LoginUserDetails member,
@Valid UpdateForm updateForm) {
if(member==null) return "redirect:/members/login";
System.out.println("hello");
memberService.updateUserInfo(member.getUsername(), updateForm.getPhone(), updateForm.getZipcode(), updateForm.getStreet(), updateForm.getDetail());
return "redirect:/userinfo";
}
UpdateForm.class
@Data
public class UpdateForm {
@NotEmpty
private String phone;
@NotEmpty
private String zipcode;
@NotEmpty
private String street;
@NotEmpty
private String detail;
public UpdateForm() {}
public UpdateForm(Member member) {
this.phone = member.getPhone();
this.zipcode = member.getAddress().getZipcode();
this.street = member.getAddress().getStreet();
this.detail = member.getAddress().getDetail();
}
}
인자가 없는 기본 Constructor를 넣은 이유가 바로 포스팅의 이유이다.
Member Entity를 받아 필드를 채우는 Constructor로 인해 기본 Constructor를 사용하지 못하게 되는데
그 때, Post 요청에서 에러가 뜬다.
2022-05-15 22:29:32.160 ERROR 59429 --- [nio-8080-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [dare.daremall.controller.member.mypage.UpdateForm]: Constructor threw exception; nested exception is java.lang.NullPointerException: Cannot invoke "dare.daremall.domain.Member.getPhone()" because "member" is null] with root cause
java.lang.NullPointerException: Cannot invoke "dare.daremall.domain.Member.getPhone()" because "member" is null
at dare.daremall.controller.member.mypage.UpdateForm.<init>(UpdateForm.java:24) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:78) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na]
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499) ~[na:na]
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480) ~[na:na]
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211) ~[spring-beans-5.3.17.jar:5.3.17]
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.constructAttribute(ModelAttributeMethodProcessor.java:332) ~[spring-web-5.3.17.jar:5.3.17]
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:220) ~[spring-web-5.3.17.jar:5.3.17]
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:85) ~[spring-webmvc-5.3.17.jar:5.3.17]
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:147) ~[spring-web-5.3.17.jar:5.3.17]
Member가 null이라면서 NullPointerException이 터지고 Constructor와 관련해서 에러가 뜨는데
아마 UpdateForm을 기본 생성자로 생성해서 그 뒤에 form 안의 field를 매핑해서 set 하는 방식인 것 같다.
당연히 Member 정보가 없기 때문에 NullPointerException이 터진 거고..
'springboot' 카테고리의 다른 글
[springboot] 순환 참조 해결 (0) | 2022.07.07 |
---|---|
[springboot - h2] docker 적응기 (0) | 2022.06.30 |
[springboot - thymeleaf] 쇼핑몰 장바구니 페이지 구현 (0) | 2022.04.25 |
[springboot-thymeleaf] 쇼핑몰 상품 찜 기능 구현하기 (0) | 2022.04.21 |
[thymeleaf] form 태그 아래 submit이 여러 개일 때 (0) | 2022.04.19 |