gpt4 book ai didi

java - 请求反序列化期间的自定义声明式 spring pojo 验证

转载 作者:行者123 更新时间:2023-11-30 12:02:03 25 4
gpt4 key购买 nike

我正在寻找注释来注释我需要在请求反序列化期间验证的 pojo 类。我正在搜索要作为参数类传递的注释,这将验证我的 pojo。

实现看起来像这样:

@ValidateAnnotation(class = ExampleClassValidator.class)
public class ExampleClass {
private String name;
}

有没有人知道该方法的任何 spring 注释或提供该声明性验证的某些依赖项?我问是因为我在文档中找不到任何类似的解决方案。

最佳答案

您可以使用@InitBinder 根据方法的目标配置 validator 。这是一个简单的例子:

注解类:

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 {
}

validator 类:

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 定义的 Controller 类:

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 方法访问要验证的目标。从那里可以直接检查类上的注释,获取 validator 类,并将其设置在 Binder 上。我相信你也可以使用 @ControllerAdvice用于配置全局 InitBinder 的注释。作为免责声明,我不知道是否建议在 InitBinder 中访问 Binder 目标,但我这样做几次都没有遇到任何问题。

关于java - 请求反序列化期间的自定义声明式 spring pojo 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58991908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com