Maven, CDI (WELD) и пакеты интерфейсов - PullRequest
0 голосов
/ 26 мая 2019

Прежде всего, я не специалист в этой области, поэтому я спрашиваю ...

У меня есть два модуля Maven, оба предоставляют несколько интерфейсов. Один модуль имеет дело с бизнес-логикой (BL), а другой является шлюзом для внешних систем (GW). Пока шлюз служит исходящим шлюзом, нет проблем с циклическими зависимостями, как это выглядит так:

BL = зависит => GW

Интерфейсы шлюза вводятся в бизнес-логику @Inject, все работает нормально.

Модуль: BusinessLogic:

public class BusinessLogicBean {
    @Inject private GatewayInterface interface;

    public void sendStuff(Param myParam) {
         interface.doSend(myParam);
    }

Модуль: шлюз

public Interface GatewayInterface {
   void doSend(Param someParam);

public class GatewayInterfaceBean {
    public void doSend(Param someParam) {
    //implementation goes here

Как только я получаю входящие вызовы, которые необходимо делегировать бизнес-логике, я не могу указать:

BL = зависит => GW = зависит => BL

, так как Maven будет жаловаться на странные зависимости.

Поэтому я решил иметь выделенный интерфейсный модуль шлюза, поэтому зависимости следующие:

BL = зависит => I_GW <= зависит = GW = зависит => BL

Пока все хорошо, несмотря на то, что @Inject сейчас жалуется на неразрешенные зависимости, тот же код, что и выше, больше не работает.

org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type OrderProcess with qualifiers @Default

в точке внедрения [BackedAnnotatedField] @Inject private de.xyz.abc.externalaccess.control.AccessServiceBean.process at de.xyz.abc.externalaccess.control.AccessServiceBean.process (AccessServiceBean.java:0)

Вот так выглядят модули: Модуль: BusinessLogic:

public class BusinessLogicBean {
    @Inject private GatewayInterface interface;

Модуль: Interfaces_Gateway

public Interface GatewayInterface {
   void doSend(Param someParam);

Модуль: шлюз

 public class GatewayInterfaceBean {
    public void doSend(Param someParam) {
    //implementation goes here


public class ProvisioningServiceTest {

private static SeContainer container;
private static ProvisioningService service;

@Test
public void testPostApplications() {
    service.postApplications(null);
}

@BeforeClass
public static void setUp() {
    SeContainerInitializer weld = Weld.newInstance();
    container = weld.initialize();
    service = container.select(ProvisioningService.class).get();
}

@AfterClass
public static void shutDown() {
    container.close();
}

}

Удар происходит в @ BeforeClass , какую часть я пропускаю? Пока интерфейс и реализация находятся в одном модуле, все хорошо, но как только я разделю его на два модуля ...

beans.xml (во всех трех модулях в META-INF:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                   http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">
<interceptors>
   <class>de.abc.util.interceptor.CallTracingInterceptor</class>
   <class>de.abc.util.interceptor.PerformanceTracingInterceptor</class>
   <class>de.abc.util.interceptor.ValidationInterceptor</class>
 </interceptors>
</beans>

СВАРКА 3.1.1

Кстати, использование этого подхода с WildFly и аннотацией @EJB вообще не вызывает проблем, но, к сожалению, Wildfly здесь не подходит.

Спасибо за любую подсказку.

1 Ответ

0 голосов
/ 02 июня 2019

Если возможно, один компонент в цепочке зависимостей должен быть @ApplicationScoped или @SessionScoped. Ссылки будут прокси, которые могут быть разрешены при необходимости во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...