我正在尝试合并带注释的验证规则以及一些自定义验证。我有一个详细信息实体,如下所示:
public class DetailsEntity {
@NotEmpty(message = "Name is required")
private String name;
private String customField;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCustomField() {
return customField;
}
public void setCustomField(String customField) {
this.customField = customField;
}
}
然后我有一个看起来像这样的控制器:
@Controller
public class EntityController {
@RequestMapping(value = "/create", method = RequestMethod.POST)
public @ResponseBody DetailsEntity create(@RequestBody @Valid
DetailsEntity details) {
//Do some creation work
}
}
这一切都很好用。问题是当我尝试使用自定义验证器和我的实体时。我的验证器看起来像这样:
@Component
public class EntityValidator implements Validator {
@Override
public boolean supports(Class<?> aClass) {
return aClass.isAssignableFrom(DetailsEntity.class);
}
@Override
public void validate(Object o, Errors errors) {
DetailsEntity entity = (DetailsEntity) o;
if (entity.getCustomField().equals("Some bad value")) {
errors.reject("Bad custom value supplied");
}
}
}
我尝试过两种方式注入验证器。一个是在控制器中使用@InitBinder
,另一个是在弹簧配置(<mvc:annotation-driven validator="entityValidator" />
)中设置全局验证器。无论哪种方式我都这样做,自定义验证器工作正常,但我的@NotEmpty
注释被忽略。如何同时使用注释和自定义验证器?
答案 0 :(得分:2)
使用SpringValidatorAdapter
作为自定义验证器的基类并覆盖validate()方法:
public void validate(Object target, Errors errors) {
// check JSR-303 Constraints
super.validate(target, errors);
// Add you custom validation here.
}
或者在自定义验证器中注入LocalValidationFactoryBean
,并在自定义验证之前或之后调用验证(目标,错误)。
答案 1 :(得分:0)