본문 바로가기

springboot

[springboot - thymeleaf] Form Dto : NullPointerException

 

마이페이지

 

마이페이지의 회원 정보를 미리 로딩하고, 수정 사항이 있으면 바로 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이 터진 거고..