我正在编写一个使用RMI调用EJB的应用程序。 EJB是无状态的;业务要求不需要与客户进行会话状态。
EJB方法调用的一个参数是" User"用于确定与调用关联的用户是否有权执行操作的对象。我们没有使用容器管理的auth-auth:User对象只是远程客户端提供的POJO。
我想在" session"中使这个User对象全局可用/可注入;或调用上下文。我知道无状态EJB没有"会话"在EJB意义上;我的意思是" session"是"当前的调用"。例如,假设我们只有一个具有两种方法的远程EJB:
myStatelessEjb.add(Thing, User)
myStatelessEjb.update(Thing, User)
这些方法调用了更多的方法:涉及其他EJB,Bean验证器等。我不想在任何地方传递User对象,而是希望使用当前远程的上下文使User对象全局可用/可注入EJB调用。
我当然可以传递User对象或用" Thing"封装它,但我想也许更好的设计是不会污染"我与User的对象和API,因为它是一个贯穿各领域的问题。
备注(强调):
是否有适合此问题的标准技术?例如也许远程客户端应该调用一个有状态的EJB来保存用户,或者ThreadLocal是合适的,或者我可以挂钩到容器管理的事务,或者可能已经有一个适用的会话/上下文I'我不知道。
答案 0 :(得分:2)
最简单的方法是将用户存储在@RequestScoped CDI bean中并根据需要注入:
@RequestScoped
public class RequestUser {
private User user;
//getter and setter for user
}
@Remote
@Statless
public class MyRemoteInterface {
@Inject
private RequestUser requestUser;
...
public void foo(User user, Bar bar) {
request.setUser(user);
...
}
}
@Stateless
public class OtherEJB() {
@Inject
private RequestUser user;
public void doBar(Bar bar) {
User user = user.getUser();
...
}
}
虽然@SessionScoped
仅对HTTP会话有用,但@RequestScoped
具有更广泛的适用性:
public @interface RequestScoped
指定bean是请求作用域。
请求范围已激活:
- 在Web应用程序中任何servlet的service()方法期间,在任何servlet过滤器的doFilter()方法期间以及 容器调用任何ServletRequestListener或AsyncListener,
- 在任何Java EE Web服务调用期间,
- 在任何EJB的任何远程方法调用期间,在任何EJB的任何异步方法调用期间,在对EJB的任何调用期间 超时方法以及在消息传递到任何EJB消息驱动的过程中 豆和
- 在从MessageEistener传递到从Java EE组件环境获取的JMS主题或队列的任何消息传递期间。