2014-11-19 3 views
0

Я работаю над приложением Spring-MVC, и я хочу проверить некоторые данные. В настоящее время я могу проверить данные без проблем. Единственное, если данные недействительны, я хотел бы перейти на другую страницу JSP, которая сейчас не происходит. Вместо этого я получаю ошибку Apache 400, запрос был отправлен синтаксически неправильно. Может ли кто-нибудь сказать мне, что все осталось реализовать при проверке.Проверка весны с перенаправлением Javax.validation на 400

Контроллер:

@RequestMapping(value = "/", method = RequestMethod.GET) 
    public String listPersons(Model model) { 
     Person person = personService.getCurrentlyAuthenticatedUser(); 
     if(!(person==null)){ 
      return "redirect:/canvas/list"; 
     } else { 
      model.addAttribute("person", new Person()); 
     // model.addAttribute("listPersons", this.personService.listPersons()); 
      model.addAttribute("notices",new Notes()); 
      model.addAttribute("canvases",new Canvas()); 
      return "person"; 
     } 
    } 

    @RequestMapping(value= "/person/add", method = RequestMethod.POST) 
    public String addPerson(@Valid Person person,@ModelAttribute("person") Person p,Model model,BindingResult bindingResult){ 

     if(bindingResult.hasErrors()){ 
      return "redirect:/"; 
     } 
      this.personService.addPerson(p); 
      return "redirect:/"; 

    } 

Сущность:

@Entity 
@Table(name="person") 
public class Person implements UserDetails{ 

    @NotEmpty @Email 
    @Column(name = "username") 
    private String username; 

    @NotEmpty(message = "Please enter password") 
    @Column(name = "password") 
    private String password; 

    @Size(min = 2,max = 30) 
    @Column(name = "firstname") 
    private String firstName; 

    @Size(min = 2,max = 50) 
    @Column(name = "secretquestion") 
    private String secretquestion; 


    @Size(min = 2,max = 500) 
    @Column(name = "secretanswer") 
    private String secretanswer; 
} 

JSP:

<tr> 
    <td> 
     <form:label path="firstName"> 
      <spring:message text="FirstName"/> 
     </form:label> 
    </td> 
    <td> 
     <form:input path="firstName" /> 
    </td> 
    <td><form:errors path="firstName"/>Please enter Firstname properly</td> 
</tr> 
<tr> 
    <td> 
     <form:label path="username"> 
      <spring:message text="Email"/> 
     </form:label> 
    </td> 
    <td> 
     <form:input path="username" /> 
    </td> 
    <td><form:errors path="username"/>Please enter Email properly</td> 
</tr> 
<tr> 
    <td> 
     <form:label path="password"> 
      <spring:message text="Password"/> 
     </form:label> 
    </td> 
    <td> 
     <form:input path="password" /> 
    </td> 
    <td><form:errors path="password"/>Please enter password properly</td> 
</tr> 

<tr> 
<td> 
    <form:label path="secretquestion"> 
     <spring:message text="secretquestion"/> 
    </form:label> 
</td> 
<td> 
    <form:input path="secretquestion" /> 
</td> 
    <td><form:errors path="secretquestion"/>Please enter secretquestion properly</td> 
</tr> 


<tr> 
    <td> 
     <form:label path="secretanswer"> 
      <spring:message text="secretanswer"/> 
     </form:label> 
    </td> 
    <td> 
     <form:input path="secretanswer" /> 
    </td> 
    <td><form:errors path="secretanswer"/>Please enter secretanswer properly</td> 
</tr> 

сервлетов-context.xml

<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"/> 

pom.xml

<!-- Validation --> 
     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.0.0.GA</version> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <version>4.3.1.Final</version> 
     </dependency> 

Все указатели было бы хорошо. В основном я хотел бы избежать перехода на Apache 400, но просто покажу, что именно пошло не так с полем ввода.

ответ

2

Возможно, это из-за public String addPerson(@Valid Person person,@ModelAttribute("person") Person p,Model model,BindingResult bindingResult) подписи.
BindingResult должен следовать за @ModelAttribute, поскольку в сигнатуре метода может быть больше одного объекта модели, а Spring создаст отдельный экземпляр BindingResult для каждого из них. Вот почему, когда данные недопустимы, весна не может связывать ошибки с BindingResult и выдает 400 ошибок.

Попробуйте изменить метод подписи на public String addPerson(@Valid Person person,@ModelAttribute("person") Person p,BindingResult bindingResult,Model model).

Подробнее о BindingResult.

+1

спасибо. Это прибило проблему. Я просто смотрю, как добавлять пользовательские сообщения, когда определенное поле выходит из строя, любые идеи? –