如何在自定义Quarkus扩展中硬编码覆盖配置禁用原JSON日志扩展?
解决Quarkus自定义JSON日志扩展的多格式化器冲突问题
以下几种硬编码禁用原quarkus-logging-json扩展配置的方法都可行:
方法1:在扩展部署阶段强制覆盖配置默认值
在自定义扩展的部署模块中编写Build Step处理器,通过Quarkus配置API强制将目标配置的默认值设为false,代码示例:
import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.builditem.ConfigurationBuildItem; class CustomJsonLogProcessor { @BuildStep ConfigurationBuildItem overrideJsonLoggingConfig() { return ConfigurationBuildItem.builder() .overrideConfigValue("quarkus.console.json.enable", "false") .overrideConfigValue("quarkus.file.json.enable", "false") .build(); } }
这种方式在构建阶段就替换掉目标配置的默认值,优先级高于用户的application.properties配置;如果需要允许用户手动开启,可改为仅设置默认值而非强制覆盖。
方法2:添加高优先级自定义配置源
在自定义扩展的运行时模块中实现ConfigSource,让它的优先级高于默认配置源,强制返回目标配置的false值:
import io.smallrye.config.ConfigSource; import java.util.HashMap; import java.util.Map; public class DisableDefaultJsonLogConfigSource implements ConfigSource { @Override public Map<String, String> getProperties() { Map<String, String> props = new HashMap<>(); props.put("quarkus.console.json.enable", "false"); props.put("quarkus.file.json.enable", "false"); return props; } @Override public String getValue(String propertyName) { return getProperties().get(propertyName); } @Override public String getName() { return "CustomJsonLogDisabler"; } // 设置高于默认配置源的优先级,确保配置被覆盖 @Override public int getOrdinal() { return 200; // 默认配置源ordinal为100,自定义值设更高即可 } }
随后在META-INF/services/io.smallrye.config.ConfigSource文件中注册该类,文件内容为该类的全限定名,运行时会优先加载此配置源的设置。
方法3:运行时初始化阶段直接覆盖配置
如果无需兼容用户自定义配置,可在自定义扩展的运行时初始化类中通过ConfigProvider修改配置(此方式不如前两种符合Quarkus扩展规范,仅作备选):
import io.smallrye.config.ConfigProvider; import io.smallrye.config.SmallRyeConfig; import jakarta.enterprise.context.ApplicationScoped; import jakarta.annotation.PostConstruct; @ApplicationScoped public class CustomJsonLogInitializer { @PostConstruct public void init() { SmallRyeConfig config = ConfigProvider.getConfig().unwrap(SmallRyeConfig.class); config.getConfigSources().stream() .filter(cs -> cs.getName().contains("applicationConfig")) .findFirst() .ifPresent(cs -> { cs.setValue("quarkus.console.json.enable", "false"); cs.setValue("quarkus.file.json.enable", "false"); }); } }
通过@PostConstruct注解让初始化逻辑在应用启动时执行。
以上方法均可解决多格式化器冲突的报错问题,推荐优先使用前两种方案,更贴合Quarkus扩展的开发规范。
内容的提问来源于stack exchange,提问作者Sof42lxca
相关产品推荐
相关产品推荐

