ConstraintValidator两次调用isValid()方法

时间:2018-12-18 17:40:18

标签: java-ee jersey jax-rs open-liberty java-ee-8

有人解释了为什么ConstraintValidator类的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()方法调用double time。 为什么呢

注意:我在JavaEE 8中使用OpenLiberty 18.0.0.3

2 个答案:

答案 0 :(得分:2)

我进行了快速测试,并确认了您注意到的行为。看起来第一次是从JAX-RS运行时调用validate,然后是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>
  

在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>
  

在org.hibernate.validator.cdi.internal.interceptor.ValidationInterceptor.validateMethodInvocation(ValidationInterceptor.java:66)
  ...
  在com.ibm.ws.jaxrs20.server.LibertyJaxRsInvoker.performInvocation(LibertyJaxRsInvoker.java:160)

总而言之,这看起来像是OpenLiberty中的错误。应该进行更新,以使isValid()仅在启用JAX-RS和CDI功能时被调用一次。

答案 1 :(得分:0)

我也在:
上确认了此错误 wildfly 14.
IBM Liberty 18.0.0.4。
 有趣的tome 8没有这个错误。