Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有一种声明性的方法来根据请求字段之一验证请求参数?_Java_Spring_Validation_Http Request Parameters - Fatal编程技术网

Java 是否有一种声明性的方法来根据请求字段之一验证请求参数?

Java 是否有一种声明性的方法来根据请求字段之一验证请求参数?,java,spring,validation,http-request-parameters,Java,Spring,Validation,Http Request Parameters,我正在寻找类似JSR-303验证组的东西(bean验证,当您在控制器中用@Validated(GroupName.class)标记方法参数并在需要的地方在请求类字段中指定group时),但它应该根据其中一个请求字段决定如何在运行时进行验证 例如,如果我们有这样的控制器类 @Controller public class MyController { @Autowired private MyService myService; @ResponseBody @Re

我正在寻找类似JSR-303验证组的东西(bean验证,当您在控制器中用@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以更具声明性的方式实现这些规则?org.springframework.validation.Validator在这里看起来不是一个选项,因为它的方法
布尔支持(Class clazz)
是基于类信息而不是实例信息来决定的


提前感谢

我不太清楚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
}

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

谢谢您的回答。事实上,重用相同的检查并以声明方式进行检查是一种很好的方法,但是仅仅在一个地方检查字段而声明自定义注释不是一种过分的做法吗?也许吧,但据我所知,这仍然是满足您需求的最简单/最具声明性的方法
@ValidType
class DetailRequestVo {
        String type;
        Long weight;
        Long radius;
    }