簡體   English   中英

使所有 spring-boot @ConfigurationProperties 字段在應用程序啟動時為必填項,無需注釋每個字段

[英]Make all spring-boot @ConfigurationProperties fields mandatory on application start without annotating each field

有沒有辦法讓所有@ConfigurationProperties字段默認為強制性,而不用注釋每個字段?

基本上我正在尋找@ConfigurationProperties(prefix = "test", ignoreUnknownFields = false)的對應物。

就像注釋或屬性一樣,我可以設置為ignoreUnknownFields但驗證我的ConfigurationProperties class 字段而不是application.yml

我想確保新添加的字段不會在運行時崩潰,如果它們被應用程序使用但在application.yml中省略。

下面的示例是我當前設置的樣子:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.core.io.Resource;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotNull;

@Validated
@ConfigurationProperties(prefix = "test")
public class TestProperties {
    @NotNull
    private Resource resource;
    @NotNull
    private String string;

    public Resource getResource() {
        return this.resource;
    }

    public String getString() {
        return this.string;
    }
}

這不會在 class 級別完成,因為您可以進行不同類型的驗證。

但是,您可以創建自己的注釋以執行任何自定義驗證:

 @Target({
     ElementType.TYPE,
     ElementType.ANNOTATION_TYPE
 })
 @Retention(RetentionPolicy.RUNTIME)
 @Constraint(validatedBy = TestPropertiesValidator.class)
 @Documented
 public @interface ValidTestProperties {
     // you can add a specific message as well 
     // String message () default "";
 }


 public class TestPropertiesValidator implements ConstraintValidator < ValidTestProperties, TestProperties > {
     @Override
     public void initialize(ValidTestProperties constraintAnnotation) {}

     @Override
     public boolean isValid(TestProperties testProperties,
         ConstraintValidatorContext context) {
         if (testProperties.getResource() == null || testProperties.getString() == null) {
             return false;
         }
     }
 }

 @Validated
 @ConfigurationProperties(prefix = "test")
 @ValidTestProperties
 public class TestProperties {

     private Resource resource;

     private String string;

     public Resource getResource() {
         return this.resource;
     }

     public String getString() {
         return this.string;
     }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM