使用Spring MVC的Hibernate验证器组

时间:2012-01-06 19:19:10

标签: spring hibernate validation model-view-controller

请你能帮帮我吗?

我遇到了Hibernate验证器/ Spring 3 MVC的问题,无法通过组进行验证。

在我的 spring-config.xml

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />

我的要验证的bean 是:

package fr.test.front.form;

import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.NotBlank;

import fr.test.front.constraints.ConstraintsProfessionnel;
import fr.test.front.constraints.FieldMatch;

@FieldMatch.List({
    @FieldMatch(first = "password", second = "passwordConfirm", message = "Les mots de passe ne correspondent pas")
})
public class InfoPersoForm {

    // Commons attributs
    @NotBlank
    private String clientType;

    @Pattern(regexp = "(([\\w\\-\\.]+)([\\w]+))@((([\\w\\-]+\\.)+)([a-zA-Z]{2,4}))")
    @NotBlank
    private String email;

    @Pattern(regexp = "[a-zA-Z0-9]*")
    @NotBlank
    private String password;

    @NotBlank
    private String passwordConfirm;

    @NotBlank
    private String civilite;

    @NotBlank
    private String nom;

    @NotBlank
    private String prenom;

    @NotBlank
    private String codePostal;

    @NotBlank
    private String offresCommerciales;

    @NotBlank
    private String offresCommercialesPartenaire;

    // No Constraint
    private String nomNaissance;
    private String jourNaissance;
    private String moisNaissance;
    private String anneeNaissance;


    // Attributs for professionnal
    @NotBlank(groups = ConstraintsProfessionnel.class)
    private String raisonSociale;

    @NotBlank(groups = ConstraintsProfessionnel.class)
    private String secteurActivite;

    @NotBlank(groups = ConstraintsProfessionnel.class)
    private String entiteeJuridique;

    // getters and setters ...
}

在我的 Spring Controller 中,我将javax.validation.Validator强制转换为org.springframework.validation.Validator以绑定结果约束。我想在结果视图中看到验证错误:

@InitBinder
public void initBinder(WebDataBinder binder) {

    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
    binder.setValidator((org.springframework.validation.Validator)validator);
}

在这里,我的题词网行动:

@RequestMapping(value="inscriptionWeb", method = RequestMethod.POST)
public String createCompteInternetService(@ModelAttribute("infoPersoForm") @Valid InfoPersoForm infoPersoForm, BindingResult result, SessionStatus status, Model model) {

    Set<ConstraintViolation<InfoPersoForm>> constraintViolations = validator.validate(infoPersoForm);

    //printing the results
    for (ConstraintViolation<InfoPersoForm> constraintViolation : constraintViolations) {
        System.out.println(constraintViolation.getPropertyPath() + " -> " +
                constraintViolation.getMessage() + "   " + constraintViolation.getMessageTemplate());
    }

    System.out.println("");
    System.out.println("----- Using Group -----");
    System.out.println("");

    constraintViolations = validator.validate(infoPersoForm, ConstraintsProfessionnel.class);

    //printing the results
    for (ConstraintViolation<InfoPersoForm> constraintViolation : constraintViolations) {
        System.out.println(constraintViolation.getPropertyPath() + " -> " + constraintViolation.getMessage());
    }


    if(infoPersoForm.getClientType() != null && infoPersoForm.getClientType().equals(DonneesReferencesInvariantes.CLIENT_TYPE_PROFESSIONNEL_VALUE))
        validator.validate(infoPersoForm, ConstraintsProfessionnel.class);
    else
        validator.validate(infoPersoForm);

    if (result.hasErrors()) {
        // return error view
    }
    else {
        // return success view
    }
}

第一个问题,我的验证组结果中只有一个constraintsProfessionnel(raisonSociale)(之后见我的结果控制台),为什么?

其他人在哪里限制专业(secteurActivite和entiteeJuridique)? 他们在我的约束错误中没有:

    19:29:42,128 INFO  [STDOUT] codePostal -> ne peut pas être vide   {org.hibernate.validator.constraints.NotBlank.message}
19:29:42,128 INFO  [STDOUT] offresCommerciales -> ne peut pas être vide   {org.hibernate.validator.constraints.NotBlank.message}
19:29:42,129 INFO  [STDOUT] email -> doit suivre "(([\w\-\.]+)([\w]+))@((([\w\-]+\.)+)([a-zA-Z]{2,4}))"   {javax.validation.constraints.Pattern.message}
19:29:42,129 INFO  [STDOUT] email -> ne peut pas être vide   {org.hibernate.validator.constraints.NotBlank.message}
19:29:42,129 INFO  [STDOUT] passwordConfirm -> ne peut pas être vide   {org.hibernate.validator.constraints.NotBlank.message}
19:29:42,129 INFO  [STDOUT] prenom -> ne peut pas être vide   {org.hibernate.validator.constraints.NotBlank.message}
19:29:42,129 INFO  [STDOUT] offresCommercialesPartenaire -> ne peut pas être vide   {org.hibernate.validator.constraints.NotBlank.message}
19:29:42,129 INFO  [STDOUT] civilite -> ne peut pas être vide   {org.hibernate.validator.constraints.NotBlank.message}
19:29:42,129 INFO  [STDOUT] nom -> ne peut pas être vide   {org.hibernate.validator.constraints.NotBlank.message}
19:29:42,129 INFO  [STDOUT] password -> ne peut pas être vide   {org.hibernate.validator.constraints.NotBlank.message}
19:29:54,803 INFO  [STDOUT] ----- Using Group -----
19:29:54,812 INFO  [STDOUT] codePostal -> ne peut pas être vide
19:29:54,812 INFO  [STDOUT] offresCommerciales -> ne peut pas être vide
19:29:54,812 INFO  [STDOUT] email -> doit suivre "(([\w\-\.]+)([\w]+))@((([\w\-]+\.)+
([a-zA-Z]{2,4}))"
19:29:54,812 INFO  [STDOUT] email -> ne peut pas être vide
19:29:54,812 INFO  [STDOUT] passwordConfirm -> ne peut pas être vide
19:29:54,812 INFO  [STDOUT] prenom -> ne peut pas être vide
19:29:54,812 INFO  [STDOUT] offresCommercialesPartenaire -> ne peut pas être vide
19:29:54,813 INFO  [STDOUT] raisonSociale -> ne peut pas être vide
19:29:54,813 INFO  [STDOUT] civilite -> ne peut pas être vide
19:29:54,813 INFO  [STDOUT] nom -> ne peut pas être vide
19:29:54,813 INFO  [STDOUT] password -> ne peut pas être vide

第二个问题,我的结果对象只有默认约束,而不是ConstraintsProfessionnel(raisonSociale,secteurActivite和entiteeJuridique),你能解释一下为什么它们不在我的结果对象中吗?

1 个答案:

答案 0 :(得分:0)

正如我所知,Spring只验证控制器方法参数的默认组。