ConstraintValidator Двойной тайм-вызов метода isValid () - PullRequest
0 голосов
/ 18 декабря 2018

Любое тело объясняет мне, почему метод isValid () класса ConstraintValidator вызывается дважды?
Например, это мой пример кода:

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

Когда я отправляю запрос в этот веб-сервис, метод isValid ()звоните дважды.
Почему?

Примечание: я использую OpenLiberty 18.0.0.3 с JavaEE 8

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Я также подтверждаю эту ошибку на:
wildfly 14.
IBM Liberty 18.0.0.4.
Интересная версия 8 не имеет этой ошибки.

0 голосов
/ 18 декабря 2018

Я сделал быстрый тест и подтвердил поведение, которое вы заметили.Похоже, что в первый раз из среды проверки JAX-RS вызываются вызовы проверки, а затем вызовы времени выполнения CDI также проверяются (поскольку ресурсы JAX-RS также являются компонентами CDI).Я смотрю, можем ли мы заставить JAX-RS избегать вызова, если OpenLiberty может обнаружить, что включена функция CDI.

Когда я включаю эти функции, JAX-RS вызывает только isValid() один раз:

<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.*

Подводя итог, это похоже на ошибку в OpenLiberty.Необходимо выполнить обновление, чтобы isValid() вызывался только один раз, когда включены функции JAX-RS и CDI.

...