Проверка пользовательских аннотаций не выполняет проверку в @PathParam весной

#java #spring #validation #spring-annotations

#java #spring #проверка #spring-аннотации

Вопрос:

Я написал пользовательскую проверку для проверки идентификатора (который является параметром path) как UUID в моем методе @GET @RestController, но эта проверка, похоже, не работает. Даже во время отладки элемент управления не переходит к пользовательской проверке.

     @RestController
    @RequestMapping("/rateplan")
    @Validated
    public class RatePlanServiceController {

    @RequestMapping(value = "/{ratePlanId}", method = RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK)
    public void get(@UUID @PathVariable("ratePlanId") String ratePlanId) {

        loggerFactory.warn("Get with Rate plan id {}", ratePlanId);
        loggerFactory.info("Get with Rate plan id {}", ratePlanId);
        loggerFactory.error("Get with Rate plan id {}", ratePlanId);
        loggerFactory.debug("Get with Rate plan id {}", ratePlanId);

        // return iRatePlanService.getRatePlan(ratePlanId);
    }
}
  

Я написал пользовательскую аннотацию для проверки UUID следующим образом.

 import org.springframework.stereotype.Component;

import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.regex.Pattern;

@Target(ElementType.PARAMETER)
@Constraint(validatedBy = {UUID.IdValidator.class})
@Retention(RetentionPolicy.RUNTIME)
public @interface UUID {
    String message() default "{invalid.uuid}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    @Component
    public class IdValidator implements ConstraintValidator<UUID, String> {


        private static final Pattern id_PATTERN =
                Pattern.compile("^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$");

        public boolean isValid(String value, ConstraintValidatorContext context) {

            if (!(id_PATTERN.matcher(value).matches())) {
                return false;
            }

            return true;
        }

        public void initialize(UUID parameters) {

        }

    }
}
  

Кто-нибудь может сообщить мне, почему это не работает. Даже если я предоставлю идентификатор ratePlanId для мусора, такой как ‘345% # 7 ^ 34’, он может попасть внутрь метода GET.

Ответ №1:

Решил это, добавив компонент в файл конфигурации приложения. Чтобы проверить параметр path в Spring, вам нужно добавить этот компонент в свой класс конфигурации.

@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}

Комментарии:

1. Очень важно упомянуть, что если ваш «@RestController» не помечен «@Validated», простое создание этого «@Bean» все равно не сработает.

2. Но почему? :-Я часами искал ошибку в своем коде, и это было проблемой…

3. После добавления этого получаем The Bean Validation API is on the classpath but no implementation could be found