SessionContext与EJBContext

装载:http://www.iteye.com/topic/283208   yingfang05

SessionContext
javax.ejb.SessionContext接口提供了一个到EJB容器环境的视
图.SessionContext对象可以像组件实例的接口到EJB容器一样获取关于方法调
用的上下文信息,和提供快速的访问EJB服务.一个会话Bean可以获得一个会话上
下文的引用通过@Resource 批注:
@Stateless
public class ProcessPaymentBean implements ProcessPaymentLocal {
@Resource SessionContext ctx;
...
}
SessionContext允许你获取如同当前用户调用EJB,或查找实体在EJB ENC中.让
我们看一下这个接口的定义:
public interface javax.ejb.SessionContext extends
javax.ejb.EJBContext {
EJBLocalObject getEJBLocalObject( ) throws IllegalStateException
EJBObject getEJBObject( ) throws IllegalStateException;
MessageContext getMessageContext( ) throws IllegalStateException;
<T> getBusinessObject(Class<T> businessInterface)
throws IllegalStateException;
Class getInvokedBusinessInterface( );
}
getEJBObject( ) 和getEJBLocalObject( )方法是陈旧的并且调用它们时会抛
出一个异常.这些对像是在EJB的2.1规范中的风格.
SessionContext.getBusinessObject( ) 方法返回一个引用到当前EJB,它可以
被其它的用户调用.这个EJB的引用等价于Java中的this指
针.businessInterface 参数必需是EJB的本地或远程接口中的一个,这样容器才
会知道当前的组件是否创建一个远程或本地引用.getBusinessObject( )方法允
许组件实例获取对自身对象的引用,它可以传递到其它组件,下面是一个例子:
@Stateless
public class A_Bean implements A_BeanRemote {
@Resource private SessionContext context;
public void someMethod( ) {
B_BeanRemote b = ... // Get a remote reference to B_Bean.
A_BeanRemote mySelf = getBusinessObject(A_BeanRemote.class);
b.aMethod( mySelf );
}
...
}
一个组件实例传递一个this引用到另一个组件是不合法的;取而代之的是,它可
以传递远程或本地EJB对象引用,组件实例的获取从它的SessionContext.
SessionContext.getInvokedBusinessInterface( )方法允许你确定是否EJB调
用通过它的远程,本地,或Web Service接口.它返回调用业务接口的类.
EJBContext接口
SessionContext 继承javax.ejb.EJBContext类.EJBContext定义了一些为组件
运行期间提供非常有用的信息的一些方法.下面是EJBContext接口的定义:
package javax.ejb;
public interface EJBContext {
public Object lookup(String name);
// EJB 2.1 only: TimerService
public TimerService getTimerService( )
throws java.lang.IllegalStateException;
// security methods
public java.security.Principal getCallerPrincipal( );
public boolean isCallerInRole(java.lang.String roleName);
// transaction methods
public javax.transaction.UserTransaction getUserTransaction( )
throws java.lang.IllegalStateException;
public boolean getRollbackOnly( )
throws java.lang.IllegalStateException;
public void setRollbackOnly( )
throws java.lang.IllegalStateException;
// deprecated and obsolete methods
public java.security.Identity getCallerIdentity( );
public boolean isCallerInRole(java.security.Identity role);
public java.util.Properties getEnvironment( );
public EJBHome getEJBHome( )
java.lang.IllegalStateException;
public EJBLocalHome getEJBLocalHome( )
java.lang.IllegalStateException;
}
EJBContext.lookup( )方法允许你查找实体在EJB的ENC中并且使其更容易.
EJBContext.getTimerService( )方法返回一个到容器的时间服务的引用,
允许无状态会话Bean为自己建立时间事件的通知.换句话说,一个会话Bean可以
设置一个警报,以便容器调用它在一个指定的日期或间隔性的传递.一个时间服
务也可以通过@Resource 批注来注入.时间服务的细节将会在第13章中进行介绍.
EJBContext.getCallerPrincipal( )方法用来获取客户端当前访问的组件的
java.security.Principal对象的引用.主要的对象罐,举例来说, 通过用EJB来
跟踪标识用户的更新.
@Stateless
public class BankBean implements Bank {
@Resource SessionContext context;
...
public void withdraw(int acctid, double amount) throws
AccessDeniedException {
String modifiedBy = principal.getName( );
...
}
...
}
EJBContext.isCallerInRole( )方法告诉你,是否客户端的访问组件是以一个指
定的成员角色,标识通过角色名.这个方法非常有用当多个访问控制,需要方法为
基础的简单访问控制提从.在一个银行系统中,例如,你可能允许出纳员这个角色
来做大多数的退回操作,但是,只有经理角色可以处理超过$10,000的退回.因为
它包括一个业务逻辑问题,所以这种细致的近代制不能够使用EJB的安全属性来
从事.因此,我们使用isCallerInRole()方法提供给EJB,增加自动访问控制.首
先,我们假定所有的经理也都是出纳员.withdraw( ) 方法中的业务逻辑使用
isCallerInRole( )来确定仅有经理角色的可以撤回总数超过$10,000:
@Stateless
public class BankBean implements Bank {
@Resource SessionContext context;
public void withdraw(int acctid, double amount) throws
AccessDeniedException {
if (amount > 10000) {
boolean isManager = context.isCallerInRole("Manager");
if (!isManager) {
// Only Managers can withdraw more than 10k.
throw new AccessDeniedException( );
}
}
}
...
}

EJBContext包含的一些方法被用在旧的EJB规,但是已经被EJB3.0放弃了.安全方
法的交互同Identity类,像getEnvironment( ), EJBContext.getEJBHome( ),
和EJBContext.getEJBLocalHome( ) 一样好的方法.已经被废弃.如果执行这些
方法会抛出RuntimeException异常

原文地址:https://www.cnblogs.com/anuoruibo/p/2409355.html