大佬教程收集整理的这篇文章主要介绍了交叉参数验证器 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,请注明来意。