Пользовательская аннотация валидатора ограничений не выполняется - PullRequest
0 голосов
/ 06 сентября 2018

После большого количества серфинга, просмотра здесь SO, чтения статей и многочисленных попыток, по какой-то причине мое пользовательское ограничение в моем приложении на основе веб-службы Spring не срабатывает. Я не могу понять это, поэтому я опрашиваю аудиторию.

Я использую Jetty 9.2.2.v20140723. Spring 4.3.13, Hibernate 5.3.0-FINAL. Ниже приведены мои файлы. На данный момент я пытаюсь реализовать проверку кросс-параметров. Пример тривиален: если два параметра не равны, проверка завершается неудачно. Файлы:

package com.xxx.yyy;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import com.xxx.validator.ValuesValidator;

public interface IGetValues {

   @Path("/{value1}/{value2}")
   @GET
   @ValuesValidator
   public MyResponse getValues(@PathParam("value1") String value1, @PathParam("value2") String value2);

}

Далее:

package com.xxx.yyy;

import org.springframework.stereotype.Component;
import com.xxx.validator.ValuesValidator;

@Component
public class GetValuesImpl implements IGetValues {

  @Override
  @ValuesValidator
  public MyResponse getValues(String value1, String value2) {
    return new MyResponse();
  }
}

Далее:

package com.xxx.yyy.validator;

import java.lang.annotation.Documented;
import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraintvalidation.SupportedValidationTarget;


@Target({METHOD, CONSTRUCTOR, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = ValuesValidatorImpl.class)
@Documented
@SupportedValidationTarget(ValidationTarget.PARAMETERS)

public @interface ValuesValidator {
 String message() default "The two values don't match";
 Class<?>[] groups() default {};
 Class<? extends Payload>[] payload() default {};
}

Далее:

package com.xxx.yyy.validator;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraintvalidation.SupportedValidationTarget;
import javax.validation.constraintvalidation.ValidationTarget;


@SupportedValidationTarget(ValidationTarget.PARAMETERS)
public class ValuesValidatorImpl implements 
   ConstraintValidator<ValuesValidator, Object[]> {

    @Override
    public void initialize(ValuesValidator valuesValidator) {

    }

    @Override
    public boolean isValid(Object[] values, ConstraintValidatorContext constraintValidatorContext) {

      String val1 = (String) values[0];
      String val2 = (String) values[1];

      return val1.equals(val2);
   }
}

Я использую PostMan для получения URL:

http://localhost:9086/path/v1/values/A/B

Так как «A» не является «B», я должен получить исключение проверки и какое-то «You Suck!» код обратно. Не везет.

Служба вызывается очень хорошо, и я получаю ответ, как и ожидалось, от MyResponse. Однако валидатор не запускается. Это точно. Я использовал System.outs, точки останова и т. Д. Этого просто не происходит.

Один источник сказал, чтобы создать класс @Configuration и добавить к нему метод получения @Bean, который возвратил объект ValuesValidatorImpl. Пытался, это не работает. Я добавил его в пакет компонентного сканирования, также объявленный в моем файле applicationContext.xml.

Любые предложения, люди? «В примере это работает нормально», на этот раз, похоже, не происходит.

ОБНОВЛЕНИЕ : я опубликовал свою проблему в списке пользователей Jetty, и один из участников попросил предоставить пример реализации этой проблемы. на Github, поэтому я обязан. Чтобы воспроизвести проблемное поведение, см .:

https://github.com/mcc99/samples/tree/master/customer-validator

Разработано с IntelliJ IDEA Community и включает в себя файл Maven .pom для удобного изучения и поиска зависимостей.

И заранее благодарю вас за любые попытки, которые вы решите решить. Мне трудно поверить, что это проблема, которая до сих пор не всплыла, поэтому я вынужден представить, что я делаю что-то не так или что-то упускаю. Также знайте, что я попробовал самую последнюю версию. Причал и проблемное поведение продолжается.

1 Ответ

0 голосов
/ 14 октября 2018

Вы должны добавить аннотацию @Validated на целевой бин.

import org.springframework.validation.annotation.Validated;

//..
@Component
@Validated
public class GetValuesImpl implements IGetValues {

В противном случае этот компонент не будет привязан к предоставленной вами пользовательской проверке.

...