2014-12-03 3 views
0

현재 사용자 편집 양식 작업 중입니다.Spring + Thymeleaf 바인딩 양식 NullpointerException

나는 (의사 코드) 다음과 같은 구조의 사용자 개체가 : 이제

User 

String name, 
int age, 
Address adress, 
Email email, 
User child, 

getter/setter 

, 나는 다음과 같은 Model에 개체로 넣어이 객체 :에

@RequestMapping(value = "/{login}/edit", method = RequestMethod.GET) 
public ModelAndView editUserByLogin(@PathVariable("login") final String login) { 
    final User currentUser = UserRepository.findPersonByLogin(login); 

    ModelAndView mav = new ModelAndView(URL_EDIT_USER); 
    mav.addObject(MODEL_USER, currentUser); 

    return mav; 
} 

내 템플릿 (나는 thymeleaf 사용)이 같은 객체를 바인딩 :

<form class="form-horizontal" method="post" > 
<div class="form-group"> 
    <label class="col-sm-2 control-label" th:text="#{user.name}">name</label> 
    <div class="col-sm-10"> 
     <input type="text" class="form-control" th:field="*{user.name}" /> 
    </div> 
</div> 
<div class="form-group"> 
    <label class="col-sm-2 control-label" th:text="#{user.address.street}">name</label> 
    <div class="col-sm-10"> 
     <input type="text" class="form-control" th:field="*{user.address.street}" /> 
    </div> 
</div> 
<div class="form-group"> 
    <label class="col-sm-2 control-label" th:text="#{user.child.email.value}">name</label> 
    <div class="col-sm-10"> 
     <input type="text" class="form-control" th:field="*{user.child.email.value}" /> 
    </div> 
</div> 
<div class="form-group"> 
    <label class="col-sm-2 control-label" th:text="#{user.child.address.street}">name</label> 
    <div class="col-sm-10"> 
     <input type="text" class="form-control" th:field="*{user.child.address.street}" /> 
    </div> 
</div> 
</form> 

In the GET-Me thod 템플릿/html은 내가 예상 한 정확한 데이터를 보여줍니다. 지금은 양식 필드를 편집하고 제출 후, 나는 다음과 같은 오류 얻을 :

java.lang.NullPointerException: null 
    at com.example.user.model.Email.hashCode(EMail.java:66) ~[classes/:na] 
    at java.lang.Object.toString(Unknown Source) ~[na:1.8.0_25] 
    at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_25] 
    at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_25] 
    at org.springframework.validation.FieldError.toString(FieldError.java:102) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEASE] 
    at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_25] 
    at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_25] 
    at org.springframework.validation.AbstractErrors.toString(AbstractErrors.java:243) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEASE] 
    at org.springframework.validation.BindException.getMessage(BindException.java:284) ~[spring-context-4.0.8.RELEASE.jar:4.0.8.RELEASE] 
    at java.lang.Throwable.getLocalizedMessage(Unknown Source) ~[na:1.8.0_25] 
    at java.lang.Throwable.toString(Unknown Source) ~[na:1.8.0_25] 
    at java.lang.String.valueOf(Unknown Source) ~[na:1.8.0_25] 
    at java.lang.StringBuilder.append(Unknown Source) ~[na:1.8.0_25] 

모든 필드가 올바르게 전송을 자식 객체의 이메일 필드를 제외하고.

나는 오류 데이터가 유효하고 재미있는 것은 내가 별도의 객체의 자식 이메일 요소를 잡을 때입니다 그것을 간다, 구조가 동일하다 발생하는 이유를 전혀 모르는

사람이 아이디어를 가지고 있는가 ?

미리 감사드립니다.

편집 : 이메일 클래스 :

@Entity(name="Email") 
public class Email implements Serializable 
{ 
    private static final long serialVersionUID = 6891079722082340011L; 

    @Id() 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Expose 
    protected Long eMailId; 
    @Expose 
    protected String value; 

    //getter/setter 

    @Override 
    public boolean equals(Object obj) 
    { 
     if(obj instanceof EMail){ 
      return value.equals(((Email) obj).getValue()); 
     } 
     return false; 
    } 

    @Override 
    public int hashCode() 
    { 
     return value.hashCode(); 
    } 
} 

포스트 방법 :

@RequestMapping(value = "/{login}/edit", method = RequestMethod.POST) 
public ModelAndView updateUser(@PathVariable("login") final String login, @ModelAttribute final User webUser) { 
    final Person repoUser = personRepository.findPersonByLogin(login); 
    repoUser.updateWith(webUser); 

    return new ModelAndView("redirect:" + URL_USERS_OVERVIEW); 
} 
+0

com.example.user.model.Email 및 EMail.java –

+0

죄송합니다. 내 잘못이었습니다. 나는 코드의 어휘 철자를 수정했다. 클래스 EMail은 이메일과 같습니다. 제 직업에 관한 규정이 있습니다. 나는 그것이 최대 절전 모드에 대한 주석에 달려 있다고 생각한다. 컨트롤러에 사용하는 클래스는 데이터베이스 (엔티티)에서 사용하는 클래스와 동일합니다. 내일 나는 코드를 업데이트 할 것이다. –

+0

게시물 처리 방법도 추가 할 수 있습니다. 처리 방법은 – Aeseir

답변

1

NullPointerException이 당신의 Email.hashCode() 방법으로 일어나고있다. 코드를 보면 value이 null 인 경우이 오류가 발생할 수 있습니다.

게시 한 템플릿에 user.email.value 필드가 포함되어 있지 않으므로 이것이 null 일 가능성이 큽니다.

사용자 전자 메일에 대한 필드를 추가하거나 null 값을 처리하도록 hashCode 메서드를 변경해야합니다.

+0

감사합니다. 어쨌든 나는 hashCode 메소드를 가지고 있었고 아마도 자동 생성되어 내 엔티티 코드에서 오버라이드되었다. –

관련 문제