Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义注释验证在spring中不对@pathParam进行验证_Java_Spring_Validation_Spring Annotations - Fatal编程技术网

Java 自定义注释验证在spring中不对@pathParam进行验证

Java 自定义注释验证在spring中不对@pathParam进行验证,java,spring,validation,spring-annotations,Java,Spring,Validation,Spring Annotations,我在@RestController的@GET方法中编写了一个自定义验证来验证一个id(这是一个路径参数)作为UUID,但是这个验证似乎不起作用。即使在调试期间,控件也不会进行自定义验证 @RestController @RequestMapping("/rateplan") @Validated public class RatePlanServiceController { @RequestMapping(value = "/{ratePlanId}"

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

        }

    }
}
导入org.springframework.stereotype.Component;
导入javax.validation.Constraint;
导入javax.validation.ConstraintValidator;
导入javax.validation.ConstraintValidatorContext;
导入javax.validation.Payload;
导入java.lang.annotation.ElementType;
导入java.lang.annotation.Retention;
导入java.lang.annotation.RetentionPolicy;
导入java.lang.annotation.Target;
导入java.util.regex.Pattern;
@目标(ElementType.PARAMETER)
@约束(validatedBy={UUID.IdValidator.class})
@保留(RetentionPolicy.RUNTIME)
公共@接口UUID{
字符串消息()默认值“{invalid.uuid}”;
类[]组()默认值{};

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

@Bean
公共方法验证后处理器方法验证后处理器(){
返回新的MethodValidationPostProcessor();

}

非常重要的一点是,如果您的“@RestController”没有用“@Validated”注释,那么简单地创建这个“@Bean”仍然无法工作。但是为什么?:-D已经在我的代码中查找了几个小时的bug,这就是问题所在。。。