Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.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 交叉参数验证程序有效,正在引发ConstraintViolationException_Java_Spring_Spring Boot_Validation_Spring Mvc - Fatal编程技术网

Java 交叉参数验证程序有效,正在引发ConstraintViolationException

Java 交叉参数验证程序有效,正在引发ConstraintViolationException,java,spring,spring-boot,validation,spring-mvc,Java,Spring,Spring Boot,Validation,Spring Mvc,我有一个带有post调用的控制器,它接收的不是POJO,而是HttpServletRequest请求和@ParamBody a la: class MyController { @PostMapping("/entrypoint") public ResponseEntity<String> hello(HttpServletRequest request, @ParamBody body){ /* Many subcalls */ } 直到那时,isVal

我有一个带有post调用的控制器,它接收的不是POJO,而是HttpServletRequest请求和@ParamBody a la:

class MyController {

@PostMapping("/entrypoint")
public ResponseEntity<String> hello(HttpServletRequest request, @ParamBody body){
 /* Many subcalls */
}
直到那时,isValid方法才开始工作。我可以从isValid正确获取clientToken。当我必须在isValid中返回false时,问题就出现了。接下来发生的事情是,没有我所期望的ParameterException,而是我无法在控制器中捕获的ConstraintViolationException。BindingResult似乎无法使用,因此我也不知道触发异常的错误是什么。从理论上看,交叉参数约束被转换为类约束,阻止我从控制器捕获ViolationConstraintException

第一个问题:考虑到签名中有一个未注释的HttpServletRequest、@ParamBody body和@Param参数,是否可以为我的示例执行跨参数验证程序

第二:如果是,那么为什么不调用isValid?我需要改变什么

第三:在控制器中添加@Validation是否将我的跨参数验证器转换为类一

第四:如果我必须使用类验证器,因为我不能使用交叉参数:我如何读取ConstraintViolationException?ControllerHandler是否足以捕获异常?如何填充ConstraintViolationException以知道应该将哪个错误响应发送回客户端

这有点长,因为这可能是一个角落的情况。我在某个地方读过,但没有消息来源证明跨参数验证只对@Param有效,而对@ParamBody无效,因为@ParamBody将由另一个组件管理,该组件可能不接受将不同类型的参数放入isValid方法中


我希望有人能帮上忙。Ping me进行任何澄清

在我看来,您应该创建一个DTO来接收有效负载,并创建
注释
来基于另一个属性验证属性,然后您应该能够注入
bindingresults
,其中包括验证错误(如果有),或者您可以进一步实现自己的验证逻辑内部控制器方法。

破坏向后兼容性超出范围。如果我有ser,那么不需要TokenClient是有充分理由的。我的问题是关于至少一个ParamBody和一个Param的交叉参数验证器
    @Constraint(validatedBy = ParamConstraintValidator.class)
    @Target({ PARAMETERS })
    @Retention(RUNTIME)
    @Documented
    public @interface ParamConstraint{
    
        String message() default "default message";
    
        Class<?>[] groups() default { };
    
        Class<? extends Payload>[] payload() default { };
    }
    
    @SupportedValidationTarget(ValidationTarget.PARAMETERS)
    public class ParamConstraintValidator implements
            ConstraintValidator<ParamConstraint, Object[]> {
    
        @Autowire
        ClientCheck clientCheck;
    
        @Override
        public void initialize(ParamConstraint paramConstraint) {
        }
    
        @Override
        public boolean isValid(Object[] value, ConstraintValidatorContext context) {
            if ( value.length != 4 ) {
                context.disableDefaultConstraintViolation();
                context.buildConstraintViolationWithTemplate("Param number is wrong")
                        .addConstraintViolation();
                return false;
            }
    
            if ( value[0] == null || value[1] == null ) {
                context.disableDefaultConstraintViolation();
                context.buildConstraintViolationWithTemplate("Param contents are null")
                        .addConstraintViolation();
                return false;
            }
            /* More validations*/
            ClientToken ct = clientCheck.verify(value[0], value[1])
    
            /* More validations*/
            value[2] = ct;
            return true;
    }
    class MyController {
    

    @PostMapping("/entrypoint")
    @ParamConstraint
    public ResponseEntity<String> hello(HttpServletRequest request, @ParamBody String body,
    @Param(required = false) ClientToken ct, BindingResult result){
       try {
        if(result.hasErrors()) {
            throw new WhateverException("Custom error to be processed by a handler");
        }
     /* Many subcalls */
       }
       catch (Exception e) {
       }
    }
@Validation
MyController