是否可以在项目中使用bean接口,并在另一个包含先前项目作为依赖项的项目中实现该bean?
我有以下界面:
CommandHandler[DBCommand]
在同一个项目(即Proj1)中,我还有以下课程:
package com.proj1.util;
import .....;
public interface Notification {
addNotification();
addError();
}
现在在第二个项目中我有package com.proj1.util.exception;
import .....;
public class ExceptionHandler extends RuntimeException ... {
private String errorMessage;
@Override
public void handle() {
Util.getBeanInstance(Notification.class).addError(errorMessage);
}
}
的实际实现,如下所示:
Notification
这种情况导致Tomcat中出现异常,消息“带有范围类型注释的WebBeans上下文@ConversationScoped在当前线程中不存在”
我的建议是添加一个生产我的NotificationBean的工厂,但它似乎没有太大变化。
package com.proj2.beans;
@Named
@ConversationScoped
public class NotificationBean implements Notification, Serializable {
private static final long serialVersionUID = 1L;
...
}
问题是如何在一个项目中使用bean,我只有它的接口,而bean实现在另一个项目中。有可能吗?
答案 0 :(得分:1)
该异常表明没有正在运行的会话,所以我首先要确定您何时尝试使用@ConversationScoped
bean以及从哪个类开始。
您的代码片段表明ExceptionHandler
类称为一个神奇的公式,我们对此不了解:
Util.getBeanInstance(Notification.class).add(...);
如果没有活动对话,尝试使用此功能可能会导致您看到的异常。因此,您可以@Inject ExceptionHandler
进入NotificationBean
,这样您就可以在有活跃对话时使用它。
关于不同项目中的接口和impl的Weld问题;有可能的。在您的proj2
Weld中,您只需识别一个bean NotificationBean
,其中的Notification
类型也会@Inject Notification
,因此您可以proj1
。
它可能不会反过来 - 在@Inject Notification
中你不能proj1
因为 <!-- jQAssistant -->
<plugin>
<groupId>com.buschmais.jqassistant.scm</groupId>
<artifactId>jqassistant-maven-plugin</artifactId>
<version>${jqassistant.version}</version>
<executions>
<execution>
<goals>
<goal>scan</goal>
<goal>analyze</goal>
</goals>
<configuration>
<failOnViolations>false</failOnViolations>
<!--
<groups>
<group>default</group>
</groups>
-->
<scanIncludes>
<scanInclude>
<path>.git</path>
</scanInclude>
</scanIncludes>
<reportProperties>
<graphml.report.directory>${project.build.directory}/graphml</graphml.report.directory>
</reportProperties>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.buschmais.jqassistant.plugin</groupId>
<artifactId>jqassistant.plugin.jpa2</artifactId>
<version>${jqassistant.version}</version>
</dependency>
<dependency>
<groupId>com.buschmais.jqassistant.plugin</groupId>
<artifactId>jqassistant.plugin.graphml</artifactId>
<version>${jqassistant.version}</version>
</dependency>
<dependency>
<groupId>de.kontext-e.jqassistant.plugin</groupId>
<artifactId>jqassistant.plugin.git</artifactId>
<version>1.1.1</version>
</dependency>
</dependencies>
</plugin>
本身没有任何实现该接口的bean。