使用microprofile-config-api:WELD-001408:带有限定符@ConfigProperty

时间:2018-08-28 05:24:56

标签: websphere-liberty open-liberty microprofile

我正在使用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

1 个答案:

答案 0 :(得分:0)

背景信息:

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

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

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

然后,当MicroProfile功能出现时,它们不适合上述任何API类别(普遍标准尚不足以被视为spec,但比third-party更稳定),因此我们赋予了新的API类型可见性:

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

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

问题说明:

由于您将apiTypeVisibility硬编码为spec, ibm-api, api, third-party,因此实际上排除了新的stable API类型,MicroProfile API被归类为该类型。要解决此问题,您可以指定:

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

这是非常冗长的,除了默认情况下,您真正​​要做的就是使third-party API可见。因此,从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"/>

其他资源: