Validación de Spring MVC con ModelAndView

Estoy tratando de agregar validación a mi aplicación Spring MVC. Anteriormente, al intentar configurar la validación, he estado usando ModelAndView para mostrar las páginas jsp, pero los mensajes de error no se muestran.

Modelo

@Entity @Table(name = "employee") public class Employee { @Id @NotEmpty(message = "Please enter your email addresss.") @Email private String email; @NotEmpty @Pattern(regexp="[a-zA-Z0-9]") private String password; @NotEmpty private String firstName; @NotEmpty private String lastName; @NotEmpty private String phoneNum; private boolean assigned; public Employee() { } // getters and setters } 

Controlador

 @RestController @RequestMapping("/employee") public class EmployeeController { private static final Logger LOGGER = LogManager .getLogger(EmployeeController.class.getName()); @Autowired private EmployeeServiceImpl employeeService; @RequestMapping(value = "/new", method = RequestMethod.GET) public ModelAndView getRegisterView(Model m) { return new ModelAndView("addEmployee", "employeeForm", new Employee()); } @RequestMapping(value = "/register", method = RequestMethod.POST) public ModelAndView postUser(@Valid Employee employee, BindingResult result) { ModelAndView model; if (result.hasErrors()) { model = new ModelAndView("addEmployee", "employeeForm", employee); } else { employeeService.addEmployee(employee); model = new ModelAndView(); model.setViewName("displayEmployee"); model.addObject("employees", employeeService.getEmployees()); } return model; } } 

Formar

  
First Name:
Last Name:
Email:
Phone Number:
Password:

 model = new ModelAndView("addEmployee", "employeeForm", employee); 

Usted mismo está destruyendo el modelo en su código, por lo que cuando regresa a la página, básicamente no queda nada. Al devolver un ModelAndView Spring MVC, se supone que ha preparado y agregado todo lo necesario para renderizar la vista usted mismo.

En su lugar, agregue @ModelAttribute("employeeForm") a su argumento de método junto a la anotación @Valid y use el modelo ya existente de BindingResult para construir un ModelAndView .

 @RequestMapping(value = "/register", method = RequestMethod.POST) public ModelAndView postUser(@Valid @ModelAttribute("employeeForm" Employee employee, BindingResult result) { ModelAndView model; if (result.hasErrors()) { model = new ModelAndView("addEmployee", result.getModel()); 

Aunque esto funcionará, por qué no simplemente devuelve una String como el nombre de la vista y realiza una preparación del Model cuando sea necesario.

 @RequestMapping(value = "/register", method = RequestMethod.POST) public String postUser(@Valid @ModelAttribute("employeeForm") Employee employee, BindingResult result, Model model) { if (result.hasErrors()) { return "addEmployee"; } else { employeeService.addEmployee(employee); model.addObject("employees", employeeService.getEmployees()); return "displayEmployee"; } } 

Incluso diría que rellenar el Model para la página de displayEmployee no pertenece aquí, sino en un método separado que prepara el modelo para esa página.