【发布时间】:2014-10-13 19:02:25
【问题描述】:
给定一个具有本地业务接口和 CMT(容器管理事务)的无状态会话 Bean。 SLSB 的所有方法都将 Transaction Attribute 设置为“REQUIRED”。
该 Bean 还有一个 SessionContext 类型的注入字段 sessionContext。
问题是:“一个bean业务方法中允许哪两个操作?”
根据 EJB 3.0 核心规范,第 4 章表 2:
SessionContext 方法:getBusinessObject、getEJBHome、getEJBLocalHome、 getCallerPrincipal, isCallerInRole, getRollbackOnly, setRollbackOnly, 获取EJBObject,获取EJBLocalObject, getTimerService,getInvokedBusinessInterface,查找JNDI访问 java:comp/env
由于这是针对 Java EE 5 的 SCBCD (1z0-860) 认证的模拟器问题,因此提供的答案是:
- sessionContex.setRollbackOnly()
- sessionContext.getBusinessObject()
另外两个可能的选项是“sessionContext.getEJBObject”和“sessionContext.getEJBLocalObject”。
在 setRollbackOnly 之后,让 SLSB 成为业务本地接口,我的第二个选择是调用 getEJBLocalObject,这实际上不是正确的答案。
模拟器提供的答案是否正确?如是: 任何人都可以帮助我更好地理解这种情况?
问候, 皮尔路易吉
【问题讨论】:
-
是不是因为 EJBObject 和 EJBLocalObject 是在 EJB 2.1 视图的情况下由 Container 生成的?问题对此没有任何说明,那么必须假设根本没有生成那些会话对象(在这种情况下只有 EJBLocalObject,因为接口是本地的)。
-
来自 JSR 220 EJB 3.0 - EJB 核心契约和要求(第 4.3.3 章): 1) SessionContext.getEJBObject 只有具有远程主接口的会话 Bean(因此 EJB 2.1 视图)可以调用此方法; 2) SessionContext.getEJBLocalObject 只有具有本地 Home 接口的会话 Bean(因此是 EJB 2.1 视图)可以调用此方法; 3) SessionContext.getBusinessObject 只有具有 EJB 3.0 业务接口 (POJO) 的会话 Bean 才能调用此方法。我相信这一定是对这个问题的解释。