我正在寻找注释pojo类的注释,在请求反序列化过程中需要对该类进行验证。我正在搜索要作为参数类传递的注释,这将验证我的pojo。
实现可以如下所示:
@ValidateAnnotation(class = ExampleClassValidator.class)
public class ExampleClass {
private String name;
}有人知道那种方法的spring注释或者提供声明性验证的依赖吗?我之所以问这个问题,是因为在文档中找不到任何类似的解决方案。
发布于 2019-12-02 19:56:23
可以使用@InitBinder根据方法的目标配置验证器。下面是一个简单的例子:
注释类:
package test.xyz;
import org.springframework.validation.Validator;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateAnnotation {
Class<? extends Validator> value();
}要验证的示例类:
package test.xyz;
@ValidateAnnotation(ExampleClassValidator.class)
public class ExampleClass {
}验证器类:
package test.xyz;
import org.springframework.validation.Errors;
public class ExampleClassValidator implements org.springframework.validation.Validator {
@Override
public boolean supports(Class<?> aClass) {
return ExampleClass.class.isAssignableFrom(aClass);
}
@Override
public void validate(Object o, Errors errors) {
}
}最后是带有@InitBinder定义的控制器类:
import org.springframework.stereotype.Controller;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import test.xyz.ExampleClass;
import test.xyz.ValidateAnnotation;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.Collections;
@Controller
public class ExampleController {
@RequestMapping(value="test-endpoint", method= RequestMethod.GET)
public @ResponseBody
Object testMethod(@Valid ExampleClass exampleClass, Errors errors) {
return Collections.singletonMap("success", true);
}
@InitBinder
public void initBinder(WebDataBinder binder, HttpServletRequest request) throws IllegalAccessException, InstantiationException {
Class<?> targetClass = binder.getTarget().getClass();
if(targetClass.isAnnotationPresent(ValidateAnnotation.class)) {
ValidateAnnotation annotation = targetClass.getAnnotation(ValidateAnnotation.class);
Class<? extends Validator> value = annotation.value();
Validator validator = value.newInstance();
binder.setValidator(validator);
}
}
}解释:
您可以使用WebDataBinder的getTarget方法访问要验证的目标。从那里可以简单地检查类上的注释,获取验证器类,并将其设置在绑定器上。我相信您也可以使用@ControllerAdvice注释来配置全局InitBinder。作为免责声明,我不知道是否建议访问InitBinder中的绑定器目标,但是我已经这样做过几次,但我没有遇到任何问题。
https://stackoverflow.com/questions/58991908
复制相似问题