Bean接口和Bean实现在不同的项目中

时间:2016-06-14 16:22:08

标签: java java-ee cdi jboss-weld

是否可以在项目中使用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实现在另一个项目中。有可能吗?

1 个答案:

答案 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。