我试图使用@Inject将EJB单例bean注入CDI bean。但是注入的实例有时是本地的,有时它是远程实例(重新启动时更改)。它不一致。
在下面的示例中,TestService ejb的远程实例被注入到GetTestData cdi托管bean中。但我期待本地实例。并且它也不一致,有时它会注入本地实例。我已经通过在GetTestData类中打印注入的bean来解决这个问题。
请注意,部署包中不包括我的测试类。
知道如何让它始终注入本地实例吗?
EJB Singleton Bean:
@Singleton
@Local(TestService.class)
@Remote(TestServiceRemote.class)
public class TestServiceImpl implements TestService {
..
}
CDI Bean:
public class GetTestData {
@Inject
TestService testService;
....
}
单元测试:
@RunWith(CdiRunner.class)
public class GetTestDataTest {
@Inject
private GetTestData getTestData;
@Produces
@ProducesAlternative
@Mock
private TestService testService;
.....
}
我使用的是 JBoss 7.1.1-Final 版本(Application Server),而Weld核心版本是 1.1.23-Final 。
我无法使用@EJB,因为我使用cdi-unit进行测试。
答案 0 :(得分:4)
首先,请记住,CDI注入不支持开箱即用的远程EJB(通过@Inject
注释)。当使用EJB作为CDI bean时,它的远程接口被排除在bean的类型集之外,如here所述。
为了能够使用远程EJB,您必须将其声明为resource。
public class ResourceProducers {
@Produces @EJB(ejbLink="../their.jar#TestServiceRemote")
TestServiceRemote remoteService;
}
因此,您所经历的行为可能来自CDI单元,因为CDI不可能在注入点使用远程EJB接口。
我的建议: