我正在使用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
答案 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"/>