程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了交叉参数验证器 isvalid 抛出 ConstraintViolationException大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决交叉参数验证器 isvalid 抛出 ConsTraintViolationException?

开发过程中遇到交叉参数验证器 isvalid 抛出 ConsTraintViolationException的问题如何解决?下面主要结合日常开发的经验,给出你关于交叉参数验证器 isvalid 抛出 ConsTraintViolationException的解决方法建议,希望对你解决交叉参数验证器 isvalid 抛出 ConsTraintViolationException有所启发或帮助;

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

class MyController {

@PostMapPing("/entrypoint")
public ResponseEntity<String> Hello(httpServletrequest request,@ParamBody body){
 /* Many subcalls */
}

控制器将调用一些对服务和其他休息客户端的子调用以​​形成响应,但我们在中间完成了许多验证,我们希望将它们移动到验证器以进行排序。在主子调用之前,会调用一个小的外部服务,根据响应,我们将虑请求是否有效。我们也会将该子调用移动到验证器,并将服务添加为 bean。我们稍后需要在我们的控制器中使用来自该调用的响应。

为此,我创建了一个验证器及其接口:

    @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;
    }

由于我们需要将该客户端令牌传递给后续的子调用,我已将其作为第三个参数添加到控制器的方法签名中(第四个参数是 BindingResult 以从上下文中检索错误)

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

我注意到的第一件事是没有调用验证器中的 isValID 。经过多次试验和错误,我尝试将@ValIDation 注释添加到控制器类中,如:

@ValIDation
MyController

然后 isValID 方法才开始工作。我可以从 isValID 正确获取 clIEntToken。当我必须在 isValID 中返回 false 时,问题就出现了。接下来发生的事情是,没有我期望的 ParameterException,而是我无法在控制器中捕获的 ConsTraintViolationException。 BindingResult 似乎无法使用,所以我也不知道触发异常的错误是什么。看起来理论上是交叉参数约束被转换为类约束,阻止我从控制器捕获 ViolationConsTraintexception。

第一个问题:虑到我在签名中有一个未注释的 httpServletrequest、一个@ParamBody 主体和一个@Param 参数,是否可以为我的示例做一个交叉参数验证器?

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

第三:在控制器中添加@ValIDation 是否将我的交叉参数验证器转换为一个类?

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

它有点冗长,因为这可能是一个角落案例。我在某处读过,但没有来源证明交叉参数验证仅适用于 @Param 而不适用于 @ParamBody,后者将由不同的组件管理,该组件可能不接受将不同类型的组件放入 isValID 方法中参数。

我希望有人能真正提供帮助。 Ping 我有任何澄清

解决方法

在我看来,您应该创建一个 DTO 来接收负载并创建 Annotation 以验证基于另一个的属性,然后您应该能够注入包含验证错误的 bindingresults是 any 或者您可以在控制器方法中进一步实现自己的验证逻辑。

大佬总结

以上是大佬教程为你收集整理的交叉参数验证器 isvalid 抛出 ConstraintViolationException全部内容,希望文章能够帮你解决交叉参数验证器 isvalid 抛出 ConstraintViolationException所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:isvalid抛出