HttpRequest
에서 추출 된 UserData 정보를 "전달"하기 위해 Injection을 사용하는 2 개의 Bean이 있습니다. WorkerBean에서 @Asynchronous
을 제거하면 모든 작업 및 WorkerBean이 아래로 주입 된 UserInfo에 액세스 할 수 있습니다. 그러나 WorkerBean에서 @Asynchronous
을 사용하면 주입이 중단됩니다.@Asynchronous bean 내부에 Java injection
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이 응용 프로그램의 시작에서 초기화되므로 WorkerBean이 생성 될 때 UserData가 없으므로 사용자가 찾고있는 것이 불가능하다고 생각합니다. –
UserData를 수동으로 생성하여 MainRs에 채울 수 있다면. 이 UserData를 WorkerBean에 수동으로 삽입하는 방법이 있습니까? –
또 다른 문제는 UserData에'HttpServletRequest'가 포함되어 있다는 것입니다. 서버 구현이 다른 클라이언트를 서비스하기 위해 해당 요청을 재사용하지 않는다고 보장 할 수는 없습니다. 그게 보안 문제를 야기합니다. –