我研究过很多很多答案,但我仍然无法看到我做错了什么。
我有一个REST服务控制器,它将bean作为参数,我想验证bean上的字段是否正确设置。
以下是我的配置对象(的一部分)。
@Configuration
@ComponentScan({...})
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
@Bean
public Validator validator() {
LocalValidatorFactoryBean validatorBean = new LocalValidatorFactoryBean();
return validatorBean;
}
@Override
public Validator getValidator() {
return validator();
}
}
我无法判断这些是否必要,但我可以告诉他们从未打过电话,所以也许他们会在错误的地方?
以下是我的pom.xml的一部分:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator-annotation-processor</artifactId>
<version>5.1.1.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
<scope>provided</scope>
</dependency>
我不认为el对于我所做的事情是必要的,但是我把它包括在内以防它有所作为。
这是我的bean类的一部分,需要进行验证:
public class ContactInfo {
@NotNull
@Size(min=1, max=50)
private String phone;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
最后,这是Rest Controller的(部分):
@RestController
@RequestMapping("/contact")
public class ContactController {
private static final String USER_ID_ATTRIBUTE = "userId";
@Autowired
private Validator validator;
@Autowired
@Qualifier("contactService")
private ContactService service;
@RequestMapping("/submit")
public void submitContact(
@Valid @RequestBody ContactInfo formData, BindingResult result) throws Exception {
assert(validator != null);
if(result.hasErrors()) {
throw new Exception("I don't like it one bit.");
}
service.submitContact(formData);
}
}
在调试器中,我可以看到传入的验证器是OptionalValidatorFactoryBean,而result.hasErrors()始终为false。
传入控制器的JSON包括:
{ "phone":"" }
我认为应该触发验证错误,因为它不符合最小尺寸。