2

我正在使用 mpConfig-1.2 功能,但它似乎在我的设置中不起作用。

使用 Liberty 18.0.0.2。

已为 microprofile-config-api 添加了 maven 依赖项,CDI 工作正常,但 @ConfigProperty 在启动时失败并显示消息

[ERROR   ] CWWKZ0106E: Could not start web application demo-service-ear {1.0-SNAPSHOT}.
[ERROR   ] CWWKZ0004E: An exception occurred while starting the application demo-service-ear {1.0-SNAPSHOT}. The exception message was: com.ibm.ws.container.service.state.StateChangeException: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type String with qualifiers @ConfigProperty
  at injection point [BackedAnnotatedField] @Inject @ConfigProperty private no.klp.bpm.task.KOPSTask.endpoint2
  at no.klp.bpm.task.KOPSTask.endpoint2(KOPSTask.java:0)

注释是这样的:

@Inject
@ConfigProperty(name="rule.engine.host", defaultValue="ukjent!")
private String endpoint2;

这里可能有什么问题?

/bwa

4

1 回答 1

1

背景资料:

这是一个类加载器可见性问题,主要存在于将旧配置(例如 2017 年之前)转移到使用 MicroProfile 的应用程序时。在 Liberty 中,API 分为以下几类:

  • api(例如 JavaSE API)
  • spec(例如 JavaEE API)
  • ibm-api(例如com.ibm.websphere.*API)
  • third-party(例如org.eclipse.persistence.*来自 JPA 2.1 功能的 API)

默认情况下,api,spec,ibm-api对应用程序可见,意思third-party是不可见(因为第三方库可能会破坏更改,这将违反 Liberty 的零迁移策略)。

然后,当 MicroProfile 功能出现时,它们不适合上述任何 API 类别(不是普遍标准,可以考虑spec,但比 更稳定third-party),因此我们创建了一个新的 API 类型可见性:

  • stable(例如org.eclipse.microprofile.*API)

现在默认启用新的stableAPI 类型,因此应用程序可以看到这些 API。

问题说明:

由于您对 进行了apiTypeVisibility硬编码spec, ibm-api, api, third-party,因此这实际上排除了新的stableAPI 类型,MicroProfile API 属于该类型。要解决此问题,您可以指定:

<classloader apiTypeVisibility="spec, stable, ibm-api, api, third-party"/>

不过,这非常冗长,您真正想做的就是使third-partyAPI 可见,除了您默认获得的任何内容。出于这个原因,从 18.0.0.3 开始,您现在可以使用“chmod 样式”语法来授予或撤销带有+-符号的各个 API 类型。例如,上面的<classloader>配置等价于:

<!-- Read as: In addition to default values, also grant 'third-party' api type visibility -->
<classloader apiTypeVisibility="+third-party"/>

其他资源:

于 2019-02-25T21:28:05.650 回答