繁体   English   中英

属性文件中值的 Java 验证器注释

[英]Java validator annotation for value from properties file

我正在尝试编写一个验证器来验证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 "";
}

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

以及我试图通过用它注释字段来使用它的方式:

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

但它似乎没有做我尝试更改@Target类型的技巧,是否甚至可以通过这种方式验证属性,我正在使用 Spring Framework。

所以通过阅读,阅读,阅读和尝试不同的事情,我自己弄清楚了。 事实证明,在我正在读取属性的类中,我必须使用@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 配置不正确,这将使应用程序在启动时失败,这本身可能是一件好事,可以立即修复,但我宁愿当它被访问时它在运行时失败并抛出一个 RumetimeException 。 无论如何,这似乎可以解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM