Spring Hibernate验证器不工作但是javax是

时间:2014-10-29 20:20:24

标签: java spring hibernate validation spring-mvc

在Spring Validation和Hibernate Validator上遇到一些麻烦。

我正在使用Spring 4和Hibernate Validator 5,我的问题是javax注释正常运行,但看起来Hibernate注释没有被调用。

这是我的控制器

@RequestMapping(method= RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void create(@RequestBody @Valid CreatePlantCommand command, BindingResult bindingResult, HttpServletResponse response){

    if (bindingResult.hasErrors()) {
        // do something
    }

    // do work

    // should set the location header on new requests
    String location = ServletUriComponentsBuilder.fromCurrentRequest()
            .pathSegment("{code}").buildAndExpand(code)
            .toUriString();

    response.setHeader("Location", location);
}

和命令对象

public class CreatePlantCommand {

    @NotNull
    private Integer code;

    @Length(min = 1, max = 5)
    //@Max(5)
    private String description;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

NotNull和Max(现在已注释掉)正在运行,但是长度似乎完全被忽略了。如果我使用Size,它会起作用,如果我使用任何Hibernate注释都会被忽略。

我正在使用Spring的LocalValidatorFactoryBean

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

为什么不应用Hibernate Validations?

修改

继续尝试了解这里发生的事情。

我注意到NotEmpty验证是唯一有效的验证。我可以将它放在描述字段而不发送它,我将得到错误。如果我在说明中添加电子邮件,电子邮件或个人信息并发送错误数据,我就不会收到错误。

修改

我创建了一个小项目,展示了这种行为。它在https://bitbucket.org/joeyoung/hibernate-validation-problems上我的bitbucket回购。

Form对象有4个公共属性,其中两个被注释掉,它们使用@Length和@Email验证器。

public class Form {

    @Length(max=10)
    public String name;

    @Email
    public String email;

//  @Range(min=18)
//  public Integer age;

//    @CreditCardNumber
//    public String creditCard;
}

如果我发布这个json;

{
  "name":"adafasdfasfdsafd",
  "email":"adf",
  "age":1,
  "creditCard":"123456"
}

到这个控制器

@RestController
@RequestMapping("/form")
public class FormController {

    @RequestMapping(method = RequestMethod.POST, consumes = "application/json")
    public List<FieldError> submitForm(@RequestBody @Valid Form form, BindingResult result) {

        if(result.hasErrors()) {
            return result.getFieldErrors();
        }

        return null;
    }
}

不会返回任何错误。

如果我取消注释@Range字段并再次发布,我会收到@Email和@Range错误,而不是@Length。

我假设我做错了什么,并且非常感谢任何指导。

服务器方面,我使用的是WebSphere Liberty 8.5,而我的server.xml是

<?xml version="1.0" encoding="UTF-8"?>
<server description="Default Liberty Server">
  <!-- Enable features -->
  <featureManager>
    <feature>jsp-2.2</feature>
    <feature>jndi-1.0</feature>
    <feature>jdbc-4.0</feature>
    <feature>jpa-2.0</feature>
    <feature>localConnector-1.0</feature>
    <feature>beanValidation-1.0</feature>
  </featureManager>
  <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
  <httpEndpoint id="defaultHttpEndpoint" httpPort="9080" httpsPort="9443" />
  <applicationMonitor updateTrigger="mbean" />
  <application id="problems_war_exploded" location="C:\Users\jyoung\Code\hibernate-validation-problems\target\problems-0.0.1-SNAPSHOT" name="problems_war_exploded" type="war" context-root="/hibernate-validation-problems" />
</server>

1 个答案:

答案 0 :(得分:2)

唉。事实证明这是一个Websphere问题。在Tomcat内部运行一切正常。围绕Websphere和Hibernate验证器的快速搜索显示,Websphere正在Hibernate之上加载它自己。

这解释了为什么Hibernate注释不起作用。