【问题标题】:Custom annotation validation does no validation on @pathParam in spring自定义注释验证不会在春季对@pathParam 进行验证
【发布时间】:2017-03-02 23:51:42
【问题描述】:

我在@RestController 的@GET 方法中编写了一个自定义验证来验证一个ID(这是一个路径参数)作为UUID,但这个验证似乎不起作用。即使在调试期间,控件也不会进行自定义验证。

    @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) {

        }

    }
}

谁能告诉我为什么它不起作用。即使我提供像 '345%#7^34' 这样的垃圾 ratePlanId,它也能够进入 GET 方法。

【问题讨论】:

    标签: java spring validation spring-annotations


    【解决方案1】:

    通过在应用程序配置文件中添加一个 bean 解决了这个问题。要在 Spring 中验证路径参数,您需要在配置类中添加此 bean。

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

    【讨论】:

    • 非常重要的一点是,如果你的“@RestController”没有用“@Validated”注解,那么简单地创建这个“@Bean”仍然是行不通的。
    • 但是为什么呢? :-D 几个小时以来一直在我的代码中寻找错误,这就是问题所在......
    • 添加后,得到The Bean Validation API is on the classpath but no implementation could be found
    猜你喜欢
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多