Maven,CDI(WELD)和界面软件包

时间:2019-05-26 15:14:25

标签: maven cdi

首先,我不是这个学科的专家,这就是为什么我要问...

我有两个Maven模块,都公开了几个接口。一个模块处理业务逻辑(BL),另一个模块是通往外部系统(GW)的网关。 只要网关用作传出网关,循环依赖关系就不会有问题,就像这样:

BL = depends => 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私有de.xyz.abc.externalaccess.control.AccessServiceBean.process   在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();
}

}

爆炸发生在内,我错过了哪一部分? 只要接口和实现驻留在同一模块中,一切都很好,但是只要我将其拆分为两个模块...

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>

WELD 3.1.1

顺便说一句,将这种方法与WildFly和@EJB注释一起使用完全不会引起问题,但是不幸的是,Wildfly在这里是没有选择的。

感谢任何提示。

1 个答案:

答案 0 :(得分:0)

如果可能,依赖关系链中的一个bean应该是@ApplicationScoped或@SessionScoped。引用将是代理,可以在运行时尽快解决。