Thorntail 中 MicroProfile Config 实现的可移植性问题



这个问题是关于以可移植方式读取REST服务中的配置的正确方法,例如应该在Thorntail 2.4.0Wildfly 15上运行。

这是Thorntail建议的原始实现

@Inject
@org.wildfly.swarm.spi.runtime.annotations.ConfigurationValue("swarm.port.offset")
private Optional<String> portOffset;

这在 WildFly 15 中不起作用,因此我们按以下方式更改了此代码:

@Inject
@ConfigProperty(name="swarm.port.offset")
private Optional<String> portOffset;

并且如果设置了系统属性,它就可以很好地工作。

但是,回到 Thorntail,它会生成以下异常:

org.jboss.weld.exceptions.DeploymentException: 焊接-001408: 带有限定符的可选类型的未满足依赖项 @ConfigProperty在
注入点 [背注字段] @Inject @ConfigProperty private com.my-company.core.internal.util.ZookeeperRegistry.portOffset
at com.my-company.core.internal.util.ZookeeperRegistry.portOffset(ZookeeperRegistry.java:0) WELD-001475:以下 bean 按类型匹配,但没有匹配 限定 符: - 生产者方法 [可选],限定符 [@Any @ConfigurationValue] 声明为 [[无背注释方法] @ConfigurationValue @Dependent @Produces org.wildfly.swarm.container.runtime.cdi.ConfigurationValueProducer.produceOptionalConfigValue(InjectionPoint)]

提前非常感谢。

代码最终在两个环境中运行,只有一个 pom 文件。

我在下面详细介绍了所采用的解决方案。

  1. @ConfigProperty使用,而不是@org.wildfly.swarm.spi.runtime.annotations.ConfigurationValue
  2. 使用@Any @ConfigProperty,已解决 WELD-001475
  3. 在 maven 依赖项方面,无论我们是为 Thorntail 还是为 WildFLy 构建,我都包含了这个依赖项

    <dependency>
    <groupId>org.eclipse.microprofile.config</groupId>
    <artifactId>microprofile-config-api</artifactId>
    </dependency>
    

实际版本使用 Eclipse 微配置文件的依赖管理进行解析:

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.eclipse.microprofile</groupId>
<artifactId>microprofile</artifactId>
<version>2.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>   
...
</dependencyManagement>
  1. Maven配置文件用于导入非"核心"的Thorntail实现,例如microprofile-health,但在microprofile-config的情况下,这不是必需的。对于 WildFly,提供了实现 org.wildfly.extension.microprofile.config.smallrye,因此该库不应包含在 war/ear 中。

最新更新