在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>
答案 0 :(得分:2)
唉。事实证明这是一个Websphere问题。在Tomcat内部运行一切正常。围绕Websphere和Hibernate验证器的快速搜索显示,Websphere正在Hibernate之上加载它自己。
这解释了为什么Hibernate注释不起作用。