CDI和EJB与glassfish 3.1混合使用

时间:2014-10-07 10:06:24

标签: java dependency-injection ejb cdi glassfish-3

我在glassfish上部署了两个应用程序 - 应用程序A和B.

两者都部署为war包,应用程序B使用应用程序A中的一些组件。

现在在应用程序A中我有一个界面:

public interface BusinessInterface() extends SomeOtherInterface {
    void someAction();
}

我有3个这个接口的实现 - 两个在应用程序A中,一个在应用程序B中:BusinessInterfaceA1, BusinessInterfaceA2, BusinessInterfaceB

只要所有这些都是CDIBeans,一切都很好 - 我正在使用自定义@Qualifier注释(@ BusinessInterfaceA1,@ BusinessInterfaceA2)和@Default注释来实现B的区别。

但是现在我需要两个应用程序的A实现都是有状态EJB,这就是它变得有趣的地方。

当我在两个实现上添加@Statefull注释时,我得到了类似的东西:

javax.servlet.ServletException: org.jboss.weld.exceptions.WeldException: WELD-000049

细节:

java.lang.IllegalStateException: Unable to convert ejbRef for ejb BusinessInterfaceA1 to a business object of type interface SomeOtherInterface

我该如何解决?我需要所有实现都可以通过我可以像

那样注入它们的方式来实现
@Inject @SomeAnnotation private BusinessInterface businessInterface;

1 个答案:

答案 0 :(得分:1)

Glassfish 3.1中的bug。解决方法是,使用所有必需的接口标记实现,例如:

@Statefull/@Stateless
public class BusinessInterfaceImpl implements BusinessInterface, SomeOtherInterface {
   // implementation
}

甚至BusinessInterface扩展了SomeOtherInterface,而且从Java规范来看,它无用,但作为该bug的解决方法,它可以正常工作。

另一种解决方案是使用Glassfish 4.0