2015-01-18 5 views
2

Я пытаюсь добавить подтверждение в мое приложение Spring MVC. Прежде чем пытаться настроить проверку, я использую ModelAndView для обслуживания страниц jsp, но сообщения об ошибках не отображаются.Spring MVC Validation w/ModelAndView

Модель

@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 
} 

Контроллер

@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; 
} 
} 

Форма

<form:form class="form-horizontal" role="form" method="POST" 
     action="register" commandName="employeeForm" modelattribute="employee"> 
     <div class="form-group"> 
      <form:label path="firstName" 
       class="control-label col-lg-2 col-lg-offset-2 col-md-2 col-md-offset-2 col-sm-12" 
       for="fname">First Name:</form:label> 
      <div class="col-lg-6 col-md-6 col-sm-12"> 
       <form:input path="firstName" class="form-control" id="fname" 
        placeholder="First Name" /> 
       <form:errors path="firstName" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <form:label path="lastName" 
       class="control-label col-lg-2 col-lg-offset-2 col-md-2 col-md-offset-2 col-sm-12" 
       for="lname">Last Name:</form:label> 
      <div class="col-lg-6 col-md-6 col-sm-12"> 
       <form:input path="lastName" class="form-control" id="lname" 
        placeholder="Last Name" /> 
       <form:errors path="lastName" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <form:label path="email" 
       class="control-label col-lg-2 col-lg-offset-2 col-md-2 col-md-offset-2 col-sm-12" 
       for="email">Email:</form:label> 
      <div class="col-lg-6 col-md-6 col-sm-12"> 
       <form:input path="email" type="email" class="form-control" 
        id="email" placeholder="Email" /> 
       <form:errors path="email" cssClass="error" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <form:label path="phoneNum" 
       class="control-label col-lg-2 col-lg-offset-2 col-md-2 col-md-offset-2 col-sm-12" 
       for="phoneNum">Phone Number:</form:label> 
      <div class="col-lg-6 col-md-6 col-sm-12"> 
       <form:input path="phoneNum" class="form-control" id="phoneNum" 
        placeholder="Phone Number" /> 
       <form:errors path="phoneNum" /> 
      </div> 
     </div> 
     <div class="form-group"> 
      <form:label path="password" 
       class="control-label col-lg-2 col-lg-offset-2 col-md-2 col-md-offset-2 col-sm-12" 
       for="pwd">Password:</form:label> 
      <div class="col-lg-6 col-md-6 col-sm-12 controls"> 
       <form:input path="password" type="password" class="form-control" 
        id="pwd" placeholder="Password" /> 
       <form:errors path="password" /> 
      </div> 
     </div> 
     <div class="form-group form-actions"> 
      <div 
       class="col-lg-offset-4 col-lg-1 col-md-offset-4 col-md-1 col-sm-1"> 
       <button type="submit" class="btn btn-primary">Register</button> 
      </div> 
      <div class="col-lg-1 col-md-1 col-sm-1"> 
       <button type="reset" class="btn btn-primary">Clear</button> 
      </div> 
     </div> 
     <form:hidden path="assigned" value="false" /> 
    </form:form> 

ответ

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

Вы разрушаете модель самостоятельно в вашем коде, поэтому при возврате на страницу есть в основном ничего не осталось. При возврате ModelAndView Spring MVC предполагает, что вы подготовили и добавили все необходимое для визуализации представления самостоятельно.

Вместо добавления @ModelAttribute("employeeForm") в свой аргумент метода рядом с @Valid аннотацию и использовать уже существующую модель из BindingResult построить 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()); 

Хотя это будет работать, почему бы не просто вернуть String как имя точки зрения и сделать некоторые Model подготовки, когда это необходимо.

@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"; 
    } 
} 

Я бы даже утверждать, что заполнение Model для displayEmployee страницы не принадлежит здесь, но в отдельном методе подготовки модели для этой страницы.

+0

Выглядит отлично, я понимаю, что я пока не применял лучшие практики. На данный момент я просто пытаюсь развернуть грубую рабочую версию. Цените, что вам нужна помощь! – GermaineJason