2014-12-03 2 views
0

В настоящее время я работаю над формой редактирования пользователем.Spring + Thymeleaf binding form 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; 
} 

в моем template (i use 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> 

В GET-Me что шаблон/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] 

Всех поля передаются правильно, если электронное поле ребенка-объект.

Я понятия не имею, почему возникает ошибка, структура же, данные корректны и самое смешное, когда я хватаю элемент детской электронной почты в отдельном объекте идет его

Кто-нибудь есть идея ?

Заранее спасибо.

EDIT: класс Email:

@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

post com.example.user.model.Email и EMail.java –

+0

жаль, что это была моя ошибка. я исправил правописание словарного запаса для кода. класс EMail аналогичен классу электронной почты. У меня есть код на моей работе. Я думаю, что это зависит от аннотации для спящего режима. классы, которые я использую для контроллера, одинаковы для базы данных (сущностей). завтра я обновлю код. –

+0

вы также можете добавить метод обработки почты, так как у вас есть только метод обработки get – Aeseir

ответ

1

NullPointerException происходит в методе Email.hashCode(). Глядя на ваш код, это может произойти, если value равно null.

Шаблон, который вы разместили, не содержит поля user.email.value, так что это, скорее всего, почему оно равно null.

Либо вам нужно добавить поле для электронной почты пользователя, либо изменить метод hashCode так, чтобы он обрабатывал нулевое значение.

+0

Спасибо. Как-то у меня был метод hashCode, возможно, сгенерированный автоматически, который был переоценен в моем коде сущности. –