有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

属性文件中值的spring Java验证程序注释

我正在尝试编写一个验证器来验证application.properties中属性的值

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = BaseUrlStartsWithHttpsValidator.class)
public @interface CheckBaseUrlStartsWithHttps {
  String message() default "Base url does not start with https:// check your configuration, "
                           + "Found: ${validatedValue}";

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

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

  String value() default "";
}

这是一个简单的验证,我只是检查字符串是否以https://开头

我试图通过注释字段来使用它,这样:

@CheckBaseUrlStartsWithHttps
@Value("${my.base.url}")
private String baseUrl;

但是它似乎没有达到我尝试过的改变@Target类型的技巧,即使这样验证属性也是可能的,我使用的是Spring框架


共 (1) 个答案

  1. # 1 楼答案

    所以,我在阅读、阅读、阅读和尝试不同的东西时发现了自己。事实证明,在我正在读取属性的类中,我必须用@Validated@ConfigurationProperties(prefix = "my")注释类本身,然后我的检查按预期工作。因此,最终产品是:

    public class BaseUrlValidator implements ConstraintValidator<CheckBaseUrl, String> {
    
      @Override
      public boolean isValid(@Nullable String value, @Nullable ConstraintValidatorContext context) {
        if (value == null) {
          return false;
        }
    
        return value.startsWith("https://");
      }
    }
    

    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @Constraint(validatedBy = BaseUrlValidator.class)
    public @interface CheckBaseUrl {
      String message() default "Base URL should start with https://. Found: ${validatedValue}";
    
      Class<?>[] groups() default {};
    
      Class<? extends Payload>[] payload() default {};
    
      String value() default "";
    }
    

    @Service
    @Validated
    @ConfigurationProperties(prefix = "my")
    public class MyService {
      @CheckBaseUrl
      @Value("${my.base.url}")
      private String baseUrl;
      ...
    }
    

    但唯一可能有点恼人的是,如果URL配置不正确,这将使应用程序在启动时失败,这本身可能是一件好事,可以立即修复,但我更希望它在被访问时在运行时失败,并抛出一个RumeMeeException。无论如何,这似乎起到了作用