Hibernate Validator的Spring Web MVC验证不会在BindingResult中绘制错误

Dar*_*ari 7 validation spring spring-mvc hibernate-validator spring-validator

我在Spring项目中一直使用Hibernate Validator.我即将JUser自动验证我的对象.即,我希望Spring验证对象并在BindigResult中设置错误.但它不起作用.

的pom.xml

<properties>
    <spring.version>4.3.5.RELEASE</spring.version>
    <spring.security.version>4.0.2.RELEASE</spring.security.version>
    <hibernate.version>4.3.11.Final</hibernate.version>
    <validation-api.version>1.1.0.Final</validation-api.version>
    <hibernate-validator.version>5.4.0.Final</hibernate-validator.version>
</properties>
....
Run Code Online (Sandbox Code Playgroud)

applicationContext.xml中

...
<tx:annotation-driven transaction-manager="hibernateTransactionManager"/>
<context:annotation-config />
<context:component-scan base-package="my.project.controller" />
<mvc:annotation-driven validator="validator">
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:messages"/>
</bean>

<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
</bean>
<bean class="org.springframework.validation.beanvalidation.MethodValidationPostProcessor">
    <property name="validator" ref="validator"/>
</bean>
<bean id="localeResolver"
      class="org.springframework.web.servlet.i18n.CookieLocaleResolver">
    <property name="defaultLocale" value="en" />
</bean>
Run Code Online (Sandbox Code Playgroud)

JUser.java

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotEmpty;

@Entity
public class JUser implements Officeable {

   @Id
   private Long id;

   @Column(unique = true, nullable = false)
   private String username;

   private String password;

   @NotEmpty
   private String firstName;

   @NotEmpty
   private String lastName;
   private String tel;
}
Run Code Online (Sandbox Code Playgroud)

UserController.java

import javax.validation.ConstraintViolationException;
....

@RequestMapping(value = "/update", method = RequestMethod.POST)
public String update2(HttpServletRequest request, Model model, @ModelAttribute("user") @Valid JUser user, BindingResult result) {
    if (!result.hasErrors()) {
        System.out.println("binding result has no errors for user ");
        try {
            JUser updated = userService.update(user);
            model.addAttribute("user", updated);
        } catch (MessageException | DataIntegrityViolationException ex) {
            result.reject("user", ex.getMessage());
        } catch (ConstraintViolationException cvex) {
            for (ConstraintViolation cv : cvex.getConstraintViolations()) {
                result.rejectValue(cv.getPropertyPath().toString(),cv.getMessageTemplate() , cv.getMessage());
            }
        }
    }
    return "user/manage";
}
Run Code Online (Sandbox Code Playgroud)

正如您在上面的控制器方法中看到的,我希望Spring验证userObject并设置错误BindigResult.但它不起作用.
例如,当user空时firstName我面对输出:

output:
binding result has no errors for user 
Run Code Online (Sandbox Code Playgroud)

我必须手工捕获hibernate引发的异常:

 ConstraintViolationException: may not be empty ...
Run Code Online (Sandbox Code Playgroud)

更多描述.我使用了String @Validated注释,它也没有用.我已经阅读了十多个相关的stackoverflow问题,但他们没有解决我的问题.

krm*_*007 1

首先,您可以在添加以下代码后测试验证是否正常工作吗?

pom.xml
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.2.4.Final</version>
    </dependency>

@Bean // in configuration
    public Validator validator() {
        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
        return validatorFactory.getValidator();
    }


@Autowired //in controller
private Validator validator;

public <T> void validate(T t) {
    Set validate = this.validator.validate(t);
    if(!validate.isEmpty()) {
        throw new RuntimeException();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果这有效,那么可以建议您进一步简化它。