Использование microprofile-config-api: WELD-001408: Неудовлетворенные зависимости для типа String с квалификаторами @ConfigProperty

Я играю с функцией mpConfig-1.2, но она не работает в моей настройке.

Использование Liberty 18.0.0.2.

Добавили зависимость maven для microprofile-config-api, 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 ответов

Справочная информация:

Это проблема видимости загрузчика классов, которая в основном возникает, когда более старые конфигурации (например, до 2017 года) переносятся в приложения, использующие MicroProfile. В Liberty API были классифицированы по следующим категориям:

  • api (например, API JavaSE)
  • spec (например, API JavaEE)
  • ibm-api (например com.ibm.websphere.* API)
  • third-party (например org.eclipse.persistence.* API из функции JPA 2.1)

По умолчанию, 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, по которому были классифицированы API MicroProfile. Чтобы исправить эту проблему, вы можете указать:

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

Это довольно многословно, и все, что вы действительно пытаетесь сделать, это включить third-party API должны быть видны, в дополнение к тому, что вы получаете по умолчанию. По этой причине с 18.0.0.3 теперь вы можете использовать синтаксис "chmod style" для предоставления или отмены отдельных типов API с + или же - приметы. Например, выше <classloader> конфиг эквивалентен:

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

Дополнительные ресурсы:

Другие вопросы по тегам