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

Portability issue with MicroProfile Config implementation in Thorntail

这个问题是关于以可移植的方式读取 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: WELD-001408: Unsatisfied dependencies for type Optional with qualifiers @ConfigProperty
at injection point [BackedAnnotatedField] @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: The following beans match by type, but none have matching qualifiers: - Producer Method [Optional] with qualifiers [@Any @ConfigurationValue] declared as [[UnbackedAnnotatedMethod] @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 解决:

<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 配置文件用于导入非 "core" 的 Thorntail 实现,例如microprofile-health,但在microprofile-config的情况下,就没有必要了。对于 WildFly,提供了实现 org.wildfly.extension.microprofile.config.smallrye,因此库不应包含在 war/ear.