gpt4 book ai didi

java - EJB3Unit 需要@LocalBean 的业务接口(interface)

转载 作者:行者123 更新时间:2023-11-30 09:40:22 24 4
gpt4 key购买 nike

我正在努力掌握 EJB3Unit ,对 EJB 3.1 无状态 bean 进行单元测试,但 EJB3Unit 提示,因为我的 EJB 没有“业务接口(interface)”。但我认为所有这些“业务接口(interface)”都是 EJB 2 的遗物,所以我不需要它。这是因为我错误地使用了 EJB3Unit 吗?我需要做什么才能让 EJB3Unit 为我的单元测试工作?

我的 EJB 本质上是这样的:

package uk.co.nildram.badamson.aoc4;

@Stateless
@LocalBean
public class AocService {

@PersistenceContext(unitName = "aoc4")
private EntityManager entityManager;

// Other code
}

我的单元测试类基本上是这样的:

package uk.co.nildram.badamson.aoc4;

public final class AocServiceTest extends BaseSessionBeanFixture<AocService> {

private static final Class<?>[] USED_ENTITY_BEANS = {};

public AocServiceTest() {
super(AocService.class, USED_ENTITY_BEANS);
}

@Test
public void testCreateSessionBean() {
final AocService bean = getBeanToTest();
checkInvariants(bean);
}

public static void checkInvariants(final AocService service) {
// assertions
}

// Other code

由于以下异常,单元测试失败:

 java.lang.IllegalStateException: No business interface found on class 'uk/co/nildram/badamson/aoc4/AocService'.
at com.bm.ejb3metadata.annotations.helper.bean.session.SessionBusinessInterfaceFinder.resolve(SessionBusinessInterfaceFinder.java:86)
at com.bm.ejb3metadata.annotations.helper.bean.SessionBeanHelper.resolve(SessionBeanHelper.java:69)
at com.bm.ejb3metadata.annotations.helper.ResolverHelper.resolve(ResolverHelper.java:91)
at com.bm.ejb3metadata.MetadataAnalyzer.analyze(MetadataAnalyzer.java:82)
at com.bm.ejb3metadata.MetadataAnalyzer.analyzeClasses(MetadataAnalyzer.java:49)
at com.bm.ejb3metadata.MetadataAnalyzer.initialize(MetadataAnalyzer.java:36)
at com.bm.ejb3metadata.annotations.metadata.MetaDataCache.getMetaData(MetaDataCache.java:129)
at com.bm.ejb3metadata.annotations.metadata.MetaDataCache.getDynamicModuleCreator(MetaDataCache.java:105)
at com.bm.creators.SessionBeanFactory.getInjector(SessionBeanFactory.java:78)
at com.bm.creators.SessionBeanFactory.createSessionBean(SessionBeanFactory.java:60)
at com.bm.testsuite.BaseSessionBeanFixture.setUp(BaseSessionBeanFixture.java:92)
at junit.framework.TestCase.runBare(TestCase.java:132)
at junit.framework.TestResult$1.protect(TestResult.java:110)
at junit.framework.TestResult.runProtected(TestResult.java:128)
at junit.framework.TestResult.run(TestResult.java:113)
at junit.framework.TestCase.run(TestCase.java:124)
at junit.framework.TestSuite.runTest(TestSuite.java:243)
at junit.framework.TestSuite.run(TestSuite.java:238)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

抛出异常的代码似乎是http://ejb3unit.sourceforge.net/xref/com/bm/ejb3metadata/annotations/helper/bean/session/SessionBusinessInterfaceFinder.html .这似乎确实需要一个“javax/ejb”接口(interface)。但是我有一个 @LocalBean,所以我的类不应该需要任何接口(interface)。

最佳答案

远程和本地业务接口(interface)是 EJB 3.x(在 EJB 3.0 中引入)的一部分,而不是 EJB 2.x 的遗物。您引用的遗物可能是 EJB 2.x 远程和本地 home 接口(interface)——那些被迫扩展 javax.ejb.EJBHome/EJBLocalHome 并被迫提供创建方法的接口(interface)。

您使用无接口(interface) View 的概念(没有单独的业务接口(interface)),它是 EJB 3.1 的一部分,而 EJB3Unit 仅支持 EJB 3.0,这就是它不起作用的原因。您需要的接口(interface)是用@Local 或@Remote 注释并让 AocService 实现它,然后通过它的接口(interface)使用 AocService。

EJB 3.1 规范使用以下术语:

Terminology note: This specification uses the term remote business interface to refer to the business interface of an EJB 3.x session bean that supports remote access. The term remote interface is used to refer to the remote component interface of the EJB 2.1 client view. The term local business interface refers to the local business interface of an EJB 3.x session bean that supports local access. The term local interface is used to refer to the local component interface of the EJB 2.1 client view.

带有 EJB 3.x 远程业务接口(interface)、本地业务接口(interface)的示例和无界面 View :

@javax.ejb.Local
public interface LocalBusinessInterface {
}

@javax.ejb.Remote
public interface RemoteBusinessInterface {
}

//@LocalBean is annotation that was introduced in EJB 3.1
//according Javadoc it "Designates that a session bean exposes a
//no-interface view."
//When bean does not implement other interfaces, using @LocalBean
//is redundant, because beans without any interfaces expose no-interface view
//by default.
@LocalBean
@Stateless
public class BeanImplementation
implements LocalBusinessInterface, RemoteBusinessInterface {
}

关于java - EJB3Unit 需要@LocalBean 的业务接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9453308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com