2012-09-21 39 views
0

我有以下設置:Spring MVC的3.1與4.3休眠驗證和錯誤

IndexCntl.java(控制器):

@RequestMapping(value = "/", method = RequestMethod.GET) 
    public String home(Locale locale, ModelMap map) { 
     Date date = new Date(); 
     DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale); 
     String formattedDate = dateFormat.format(date); 
     map.addAttribute("serverTime", formattedDate); 
     map.addAttribute("email", new Email()); 
     Map sexoOpts = new HashMap(); 
     sexoOpts.put("M", "Homem"); 
     sexoOpts.put("F", "Mulher"); 

     map.addAttribute("sexoList", sexoOpts); 
     return "index"; 
    } 

@RequestMapping(value = "/save-email", method = RequestMethod.POST) 
    public String doSaveEmail(@Valid @ModelAttribute("email") Email email, Model model, BindingResult result){ 
     log.info("Email debug: "+email.getEmail()+" "+email.getMysexy()+" "+email.getWantedsexy()); 

     if (result.hasErrors()){ 
      log.info("Entrou result.hasError()"); 
      return "index"; 
     } 
     Date date = new Date(); 
     email.setCreationDate(date); 
     try{ 
      emailBo.saveEmail(email); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     model.addAttribute("email", new Email()); 
     return "index"; 
    } 

的index.jsp(視圖):

<form:form action="save-email" method="POST" modelAttribute="email" cssStyle="display:-webkit-box"> 
       <form:select path="mysexy" cssStyle="width:120px;"> 
        <form:option value="" label="- Sou -"/> 
        <form:options items="${sexoList}" /> 
       </form:select> 
       <form:errors path="mysexy" cssClass="errors"/> 
       <form:select path="wantedsexy" cssStyle="width:120px;"> 
        <form:option value="" label="- Busco -"/> 
        <form:options items="${sexoList}" /> 
       </form:select> 
       <form:errors path="wantedsexy" cssClass="errors"/> 
       <br/> 
       <form:errors path="wantedsexy" cssClass="errors"/> 
       <div class="input-append"> 
        <input type="text" id="email" name="email" size="30" maxlength="30" placeholder="E-mail" class=""/> 
        <form:errors path="email" cssClass="errors"/> 
        <input id="btncadastrar" class="btn btn-block btn-primary" type="submit" value="Cadastrar E-mail"/> 
       </div> 
      </form:form> 

以及部分型號Email.java:

@Document 
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) 
public class Email extends BaseBean { 

    // @Pattern(regexp = 
    // "^[\\w\\-]+(\\.[\\w\\-]+)*@([A-Za-z0-9-]+\\.)+[A-Za-z]{2,4}$", 
    // message="E-mail com formato incorreto.") 
    @NotNull(message = "Não pode ser vazio") 
    @NotEmpty(message = "Não pode ser vazio-nulo") 
    @org.hibernate.validator.constraints.Email(message = "E-mail inválido") 
    private String email; 

    @NotEmpty(message = "Informe ao menos um valor") 
    private String mysexy; 

    @NotEmpty(message = "Informe ao menos um valor") 
    private String wantedsexy; 

,我當我嘗試用空的電子郵件通過輸入我收到此錯誤:

exception 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'email' on field 'email': rejected value []; codes [NotEmpty.email.email,NotEmpty.email,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [email.email,email]; arguments []; default message [email]]; default message [Não pode ser vazio-nulo] 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) 
    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) 
root cause 

org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors 
Field error in object 'email' on field 'email': rejected value []; codes [NotEmpty.email.email,NotEmpty.email,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [email.email,email]; arguments []; default message [email]]; default message [Não pode ser vazio-nulo] 
    org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:110) 

什麼都可以錯在我的設置???

+0

如果我創建在控制器的方法initBinder和用「@InitBinder」註釋它,然後設置一個binder.setValidator它開始工作,但我將不得不在手中實現它?有沒有意義使用Hibernate驗證程序然後... – tiagomac

回答

1

您明確禁止空值:

@NotNull(message = "Não pode ser vazio") 
--> @NotEmpty(message = "Não pode ser vazio-nulo") 
    @org.hibernate.validator.constraints.Email(message = "E-mail inválido") 
    private String email; 

的Hibernate保存或更新之前驗證實體,和你的實體失敗。

您可以在您的文件配置中禁用此驗證persistence.xml

<persistence ...> 
    <persistence-unit ...> 
    ... 
    <properties> 
     <property name="javax.persistence.validation.mode" value="none"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

如果你想只檢查一些驗證規則,那麼你可以使用 「驗證Groupes」


如果你的問題是控制器方法沒有被調用,那麼這是因爲@ValidEmail的註釋。如果你想有一個控制器的方法是調用的事件如果與@Valid annotaton參數是無效的,那麼你就需要BindingResult類型的參數後直接該參數

public String doSaveEmail(@Valid @ModelAttribute("email") Email email, BindingResult resultForEmail, Model model, BindingResult resultForModel) 
+0

我沒有使用Hibernate持久性,只是它的驗證實現。當我嘗試用@Valid命中控制器時出現問題,當我提交控制器的方法「doSaveEmail」時,代碼因爲驗證而不加入它,因此他給出了以「BindException」和「 BeanPropertyBindingResult「,我做錯了使用spring mvc 3.1與休眠驗證程序4.3 ??? – tiagomac