У меня есть 2 компонента, которые используют Injection для передачи данных UserData, которая извлекается из HttpRequest
. Если я удалю @Asynchronous
из WorkerBean, тогда все его рабочие и WorkerBean могут получить доступ к UserInfo, которые были введены вниз. Однако, если я использую @Asynchronous
на WorkerBean, тогда инъекция перестает работать.Java-инъекция внутри @Asynchronous bean
Каков наилучший способ вручную создать/передать 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. Есть ли способ вручную ввести эту UserData в WorkerBean? –
Другая проблема, с которой вы сталкиваетесь, заключается в том, что UserData имеет встроенный в нее HttpServletRequest. У вас нет гарантии, что реализация вашего сервера не будет повторно использовать этот запрос для обслуживания другого клиента. Это вызывает проблемы с безопасностью. –