2012-09-02 54 views
3

我希望能夠在Web界面中顯示我的實體字段約束驗證錯誤Spring MVC - 帶註釋的約束驗證 - 不顯示錯誤消息

例如,我有以下限制在我的實體定義:

@RooJavaBean 
@RooToString 
@RooJpaActiveRecord 
public class Member { 

    @NotNull 
    @Email 
    @Column(unique = true) 
    private String email; 

    private String pseudo; 

    @NotNull 
    @Size(min = 6) 
    private String password; 

    @NotNull 
    @Size(min = 2) 
    private String firstName; 

    @NotNull 
    @Size(min = 2) 
    private String lastName; 

    @Temporal(TemporalType.DATE) 
    @DateTimeFormat(pattern = "dd/MM/yyyy") 
    private Date dateOfBirth; 

    @NotNull 
    @Enumerated 
    private Orientation orientation; 

    @NotNull 
    private String token; 

    @NotNull 
    @Temporal(TemporalType.TIMESTAMP) 
    @DateTimeFormat(pattern = "dd/MM/yyyy") 
    private Date registrationDate; 

    private boolean activated; 
} 

我還定義我在彈簧MVC控制器使用一個輔助的JavaBean;這就是:

@RooJavaBean 
public class RegistrationInfo { 

    private Member member; 

    private String passwordConfirmation; 

} 

這裏是我的Spring MVC的控制器相關代碼:

@RequestMapping(value = "/registration", method = RequestMethod.POST, produces = "text/html") 
public String registerMember(@ModelAttribute("registrationInfo") @Valid RegistrationInfo registrationInfo, Model model, BindingResult bindingResult) { 
    if (!registrationInfo.getMember().getPassword().equals(registrationInfo.getPasswordConfirmation())) { 
     bindingResult.addError(new ObjectError("member.password", "passwords don't match")); 
    } 
    if (!registrationService.isEmailAvailable(registrationInfo.getMember().getEmail())) { 
     bindingResult.addError(new ObjectError("member.email", "email already used")); 
    } 
    if (bindingResult.hasErrors()) { 
     //HOW TO ADD BEAN CONSTRAINTS VALIDATION ERRORS HERE???? 
     populateForm(model, registrationInfo); 
     return "registration"; 
    } 
    registrationService.registerMember(registrationInfo.getMember()); 
    return "redirect:/"; 
} 

從我的UI:

<div id="errors"> 
      <ul th:if="${#fields.hasErrors('*')}"> 
       <li th:each="err : ${#fields.errors('*')}" th:text="${err}"></li> 
      </ul> 
     </div> 

然而,按目前,唯一的錯誤,將要顯示的是我手動添加的錯誤(如bindingResult.addError)...

Can a請提供建議嗎?

編輯:如果我註釋member變量與@Valid,我得到驗證表單時,此異常:

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 5 errors 
Field error in object 'registrationInfo' on field 'member.password': rejected value []; codes [Size.registrationInfo.member.password,Size.member.password,Size.password,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [registrationInfo.member.password,member.password]; arguments []; default message [member.password],2147483647,6]; default message [la taille doit �tre entre 6 et 2147483647] 
Field error in object 'registrationInfo' on field 'member.firstName': rejected value []; codes [Size.registrationInfo.member.firstName,Size.member.firstName,Size.firstName,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [registrationInfo.member.firstName,member.firstName]; arguments []; default message [member.firstName],2147483647,2]; default message [la taille doit �tre entre 2 et 2147483647] 
Field error in object 'registrationInfo' on field 'member.token': rejected value [null]; codes [NotNull.registrationInfo.member.token,NotNull.member.token,NotNull.token,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [registrationInfo.member.token,member.token]; arguments []; default message [member.token]]; default message [ne peut pas �tre nul] 
Field error in object 'registrationInfo' on field 'member.registrationDate': rejected value [null]; codes [NotNull.registrationInfo.member.registrationDate,NotNull.member.registrationDate,NotNull.registrationDate,NotNull.java.util.Date,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [registrationInfo.member.registrationDate,member.registrationDate]; arguments []; default message [member.registrationDate]]; default message [ne peut pas �tre nul] 
Field error in object 'registrationInfo' on field 'member.lastName': rejected value []; codes [Size.registrationInfo.member.lastName,Size.member.lastName,Size.lastName,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [registrationInfo.member.lastName,member.lastName]; arguments []; default message [member.lastName],2147483647,2]; default message [la taille doit �tre entre 2 et 2147483647] 
    org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:111) 
    org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:75) 
    org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:156) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:147) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 

回答

3

添加@Validmember屬性中RegistrationInfo

@RooJavaBean 
public class RegistrationInfo { 

    private @Valid Member member; 

    private String passwordConfirmation; 

} 

然後在你的控制器方法,bindingResult必須在registrationInfo之後:

public String registerMember(@ModelAttribute("registrationInfo") @Valid RegistrationInfo registrationInfo, 
BindingResult bindingResult, Model model) { 
+0

謝謝傑羅姆,我已經註釋了變量,因爲你建議並編輯我的文章。 – balteo