【发布时间】:2016-12-17 16:47:24
【问题描述】:
我有 2 个 bean 使用注入来“传递”从 HttpRequest 提取的 UserData 信息。如果我从 WorkerBean 中删除 @Asynchronous 那么它的所有工作和 WorkerBean 可以访问被注入的 UserInfo。
但是,如果我在 WorkerBean 上使用@Asynchronous,则注入将停止工作。
如果必须是异步的,手动创建/传递 UserInfo 到 WorkerBean 的最佳方法是什么?
// resource class
@Stateless
class MainRs {
@Context
protected HttpServletRequest request;
@Inject
protected UserData userData;
@EJB
WorkerBean job;
@Path("/batch/job1")
public function startJob() {
// call on worker bean
job.execute();
}
}
// user data extracted from HttpRequest
@RequestScoped
@Default
class UserData {
private HttpServletRequest request;
private String userId;
@Inject
public UserData(HttpServletRequest request) {
super();
this.request = request;
userId = request.getHeader("userId");
}
public int getUserId() {
return userId;
}
}
@Stateless
@Asynchronous
class WorkerBean {
private UserData userData;
// inject userData rom caller bean
@Inject
public WorkerBean(UserData userData) {
super();
this.userData = userData;
}
public function execute() {
String userId = userData.getUserId();
// do something
}
}
【问题讨论】:
-
我认为你正在寻找的是不可行的,因为 WorkerBean 将在应用程序启动时初始化,而 UserData 将在获取请求时初始化,所以在创建 WorkerBean 时没有 UserData .
-
如果我可以手动创建 UserData 并将其填充到 MainRs 中。有没有办法在 WorkerBean 中手动注入这个 UserData?
-
您遇到的另一个问题是 UserData 中嵌入了
HttpServletRequest。您无法保证您的服务器实现不会重复使用该请求来服务另一个客户端。这引发了安全问题 -
正如@SteveC 提到的,您需要 HttpServletRequest 实例来创建 UserData,但是如果您想手动注入某些东西,则必须公开 getter 和 setter 并使用它们来设置您想要的值。
-
那么,如果我将 HttpRequest 传递给异步 bean,我该如何手动重建我的 UserData?
标签: java asynchronous ejb inject