首頁 > 軟體

ConditionalOnProperty設定swagger不生效問題及解決

2022-06-14 10:00:31

ConditionalOnProperty設定swagger不生效

問題

在正式環境準備關閉Swagger,新增了ConditionalOnProperty註解進行設定,結果發現怎麼也無法關閉swagger。

問題原因

@EnableSwagger2在多個地方進行了設定,如下:

1)應用程式處進行了設定

@SpringCloudApplication
@EnableSwagger2  //在應用程式處進行了設定
public class SysApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(SysApplication.class,args);
    }
}

2)swagger處進行了設定

@Configuration
@EnableSwagger2  //在swagger本身設定處進行了設定
@ConditionalOnProperty(value = "swagger.manenabled", havingValue = "true")
public class SwaggerConfig {
}

實際在2)處的設定已經生效,但由於1)處有設定所以造成這個問題。

解決方案

將1)處的設定關閉即可。

@ConditionalOnProperty理解和使用

在Spring應用程式開發的過程中,可能需要根據設定屬性的存在和值有條件地建立一些bean,@ConditionalOnProperty註解用於僅在環境屬性存在且具有特定值時才啟用 bean 註冊。

註解原始碼

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnPropertyCondition.class})
public @interface ConditionalOnProperty {
//獲取對應property名稱的值,與name不可同時使用
    String[] value() default {};
 
//設定屬性名稱的字首
    String prefix() default "";
 
//設定屬性完整名稱或部分名稱
//可與prefix組合使用,組成完整的設定屬性名稱,與value不可同時使用
    String[] name() default {};
 
//可與name組合使用,比較獲取到的屬性值與havingValue給定的值是否相同,相同才載入設定
    String havingValue() default "";
 
//缺少該設定屬性時是否可以載入。如果為true,沒有該設定屬性時也會正常載入;反之則不會生效
    boolean matchIfMissing() default false;
}

value以及 prefix + name 決定屬性值(Property Value),以下為匹配規則

解析:假如havingValue為空,

  • 屬性值為boolean型別,則屬性值為true 載入該bean,屬性值為false 不載入該bean。
  • 如果屬性值不為boolean型別,則有該屬性 則載入bean,沒有該屬性則不載入。

範例

屬性值不是boolean型別的情況

@Bean(name = "emailNotification")
@ConditionalOnProperty(prefix = "notification", name = "service")
public NotificationSender notificationSender() {
    return new EmailNotification();
}

如果設定該屬性則載入:

notification.service=email

屬性值為boolean型別

@Bean(name = "emailNotification")
@ConditionalOnProperty(prefix = "notification", name = "enable")
public NotificationSender notificationSender() {
    return new EmailNotification();
}

如果設定為true則載入

notification.enable=true

如果缺失或為false則不載入

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com