0

这个问题是关于以可移植方式读取 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: 类型 Optional 的不满足依赖项,
在注入点带有限定符 @ConfigProperty [BackedAnnotatedField] @Inject @ConfigProperty private com.my-company.core.internal.util.ZookeeperRegistry.portOffset
在com.my-company.core.internal.util.ZookeeperRegistry.portOffset(ZookeeperRegistry.java:0) WELD-001475:以下 bean 按类型匹配,但没有匹配的限定符:-生产者方法 [可选] 带限定符 [@Any @ConfigurationValue] 声明为 [[UnbackedAnnotatedMethod] @ConfigurationValue @Dependent @Produces org.wildfly.swarm.container.runtime.cdi.ConfigurationValueProducer.produceOptionalConfigValue(InjectionPoint)]

提前谢谢了。

4

1 回答 1

0

代码最终在两个环境中运行,只有一个 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 配置文件用于导入非“核心”的 Thorntail 实现,例如 microprofile-health,但在 microprofile-config 的情况下,它不是必需的。对于 WildFly,提供了实现 org.wildfly.extension.microprofile.config.smallrye,因此该库不应包含在 war/ear 中。
于 2019-06-19T08:38:21.613 回答