当我有以下带有 JSR-303(验证框架)注释的模型时:
public enum Gender {
MALE, FEMALE
}
public class Profile {
private Gender gender;
@NotNull
private String name;
...
}
以及以下 JSON 数据:
{ "gender":"INVALID_INPUT" }
在我的 REST 控制器中,我想处理两个绑定错误(无效的枚举值)gender
属性)和验证错误(name
属性不能为空)。
以下控制器方法不起作用:
@RequestMapping(method = RequestMethod.POST)
public Profile insert(@Validated @RequestBody Profile profile, BindingResult result) {
...
}
这给出了com.fasterxml.jackson.databind.exc.InvalidFormatException
绑定或验证发生之前发生序列化错误。
经过一番摆弄后,我想出了这个自定义代码,它可以实现我想要的功能:
@RequestMapping(method = RequestMethod.POST)
public Profile insert(@RequestBody Map values) throws BindException {
Profile profile = new Profile();
DataBinder binder = new DataBinder(profile);
binder.bind(new MutablePropertyValues(values));
// validator is instance of LocalValidatorFactoryBean class
binder.setValidator(validator);
binder.validate();
// throws BindException if there are binding/validation
// errors, exception is handled using @ControllerAdvice.
binder.close();
// No binding/validation errors, profile is populated
// with request values.
...
}
基本上,此代码的作用是序列化为通用映射而不是模型,然后使用自定义代码绑定到模型并检查错误。
我有以下问题:
- 自定义代码是这里的方法还是在 Spring Boot 中是否有更标准的方法?
- 如何
@Validated
注释工作?我怎样才能制作自己的自定义注释,其工作原理如下@Validated
封装我的自定义绑定代码?