ConstraintValidator 两次调用 isValid() 方法
ConstraintValidator Double time call isValid() method
谁能解释一下为什么 ConstraintValidator class 的 isValid() 方法被调用了两次?
例如,这是我的示例代码:
@POST
@Path("/json/dog")
@Produces("application/json")
@Consumes("application/json")
public Response getDogByJson(@ValidAnimal JsonObject jsonObject) {
return Response.ok("ok").build();
}
@Constraint(validatedBy = {AnimalValidation.class})
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface ValidAnimal {
String message() default "This is not valid !";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
public class AnimalValidation implements ConstraintValidator<ValidAnimal, JsonObject> {
@Override
public void initialize(ValidAnimal constraintAnnotation) {
}
@Override
public boolean isValid(JsonObject jsonObject, ConstraintValidatorContext context) {
System.out.println(">>>>>> : " + jsonObject);
return true;
}
}
当我向此 Web 服务发送请求时,isValid() 方法调用两次。
为什么 ?
注意:我使用 OpenLiberty 18.0.0.3 和 JavaEE 8
我进行了快速测试并确认了您注意到的行为。看起来第一次是从 JAX-RS 运行时调用验证,然后 CDI 运行时调用也验证(因为 JAX-RS 资源也是 CDI bean)。我正在研究如果 OpenLiberty 可以检测到 CDI 功能已启用,我们是否可以让 JAX-RS 避免调用。
当我启用这些功能时,isValid()
仅被 JAX-RS 调用一次:
<featureManager>
<feature>jaxrs-2.1</feature>
<feature>jsonp-1.1</feature>
<feature>beanValidation-2.0</feature>
</featureManager>
at com.ibm.ws.jaxrs20.server.LibertyJaxRsInvoker.callValidationMethod(LibertyJaxRsInvoker.java:371)
但是当我们启用 CDI 功能时,CDI 运行时也会调用 isValid()
:
<featureManager>
<feature>jaxrs-2.1</feature>
<feature>jsonp-1.1</feature>
<feature>beanValidation-2.0</feature>
<feature>cdi-2.0</feature>
</featureManager>
at org.hibernate.validator.cdi.internal.interceptor.ValidationInterceptor.validateMethodInvocation(ValidationInterceptor.java:66)
...
at com.ibm.ws.jaxrs20.server.LibertyJaxRsInvoker.performInvocation(LibertyJaxRsInvoker.java:160)
总而言之,这看起来像是 OpenLiberty 中的一个错误。应进行更新,以便在启用 JAX-RS 和 CDI 功能时仅调用一次 isValid()
。
我也在 :
上确认了这个错误
野蝇 14.
IBM 自由 18.0.0.4.
有趣的是 tomee 8 没有这个错误。
谁能解释一下为什么 ConstraintValidator class 的 isValid() 方法被调用了两次?
例如,这是我的示例代码:
@POST
@Path("/json/dog")
@Produces("application/json")
@Consumes("application/json")
public Response getDogByJson(@ValidAnimal JsonObject jsonObject) {
return Response.ok("ok").build();
}
@Constraint(validatedBy = {AnimalValidation.class})
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.PARAMETER)
public @interface ValidAnimal {
String message() default "This is not valid !";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
public class AnimalValidation implements ConstraintValidator<ValidAnimal, JsonObject> {
@Override
public void initialize(ValidAnimal constraintAnnotation) {
}
@Override
public boolean isValid(JsonObject jsonObject, ConstraintValidatorContext context) {
System.out.println(">>>>>> : " + jsonObject);
return true;
}
}
当我向此 Web 服务发送请求时,isValid() 方法调用两次。
为什么 ?
注意:我使用 OpenLiberty 18.0.0.3 和 JavaEE 8
我进行了快速测试并确认了您注意到的行为。看起来第一次是从 JAX-RS 运行时调用验证,然后 CDI 运行时调用也验证(因为 JAX-RS 资源也是 CDI bean)。我正在研究如果 OpenLiberty 可以检测到 CDI 功能已启用,我们是否可以让 JAX-RS 避免调用。
当我启用这些功能时,isValid()
仅被 JAX-RS 调用一次:
<featureManager>
<feature>jaxrs-2.1</feature>
<feature>jsonp-1.1</feature>
<feature>beanValidation-2.0</feature>
</featureManager>
at com.ibm.ws.jaxrs20.server.LibertyJaxRsInvoker.callValidationMethod(LibertyJaxRsInvoker.java:371)
但是当我们启用 CDI 功能时,CDI 运行时也会调用 isValid()
:
<featureManager>
<feature>jaxrs-2.1</feature>
<feature>jsonp-1.1</feature>
<feature>beanValidation-2.0</feature>
<feature>cdi-2.0</feature>
</featureManager>
at org.hibernate.validator.cdi.internal.interceptor.ValidationInterceptor.validateMethodInvocation(ValidationInterceptor.java:66)
...
at com.ibm.ws.jaxrs20.server.LibertyJaxRsInvoker.performInvocation(LibertyJaxRsInvoker.java:160)
总而言之,这看起来像是 OpenLiberty 中的一个错误。应进行更新,以便在启用 JAX-RS 和 CDI 功能时仅调用一次 isValid()
。
我也在 :
上确认了这个错误
野蝇 14.
IBM 自由 18.0.0.4.
有趣的是 tomee 8 没有这个错误。