有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否有一种声明性的方法来验证请求参数,取决于请求字段之一?

我正在寻找类似JSR-303验证组的东西(bean Validation,当您在控制器中用@Validated(GroupName.class)标记方法参数,并在需要的地方在请求类字段中指定group时),但它应该根据其中一个请求字段来决定如何在运行时进行验证

例如,如果我们有这样的控制器类

@Controller
public class MyController {
    @Autowired
    private MyService myService;

    @ResponseBody
    @RequestMapping(value = "/path", method = RequestMethod.PUT)
    public ResponseVo storeDetail(/*maybe some annotation here*/ DetailRequestVo requestVo) {
        return myService.storeDetail(requestVo);
    }

    class DetailRequestVo {
        String type;
        Long weight;
        Long radius;
    }
}

我们希望根据类型字段值进行验证:如果type=“wheel”,则应显示半径和重量字段,如果type=“engine”,则仅应显示重量字段

Spring(从3.2.17开始)是否提供了API以更具声明性的方式实现这些规则?组织。springframework。验证。验证器在这里看起来不是一个选项,因为它的方法boolean supports(Class<?> clazz)是基于类信息而不是实例信息来决定的

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    不确定Spring,但您可以使用简单的JSR-303,使用类本身的自定义验证器来实现这一点。。。就像

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ ElementType.TYPE })
    @Constraint(validatedBy = TypeValidator.class)
    @Documented
    public @interface ValidType {
          ...
    }
    
    public class TypeValidator implements ConstraintValidator<ValidType , Object> {
    
        public boolean isValid(final Object target, final ConstraintValidatorContext context) {
            DetailRequestVo request = (DetailRequestVo) target;
            // do your checks here
    }
    

    就像

    @ValidType
    class DetailRequestVo {
            String type;
            Long weight;
            Long radius;
        }
    

    由于自定义验证器可以访问整个DetailRequestVo对象,因此您可以根据字段B等对字段A进行检查