J'ai 2 beans qui utilisent Injection pour "passer" les informations UserData qui sont extraites de HttpRequest
. Si je supprime @Asynchronous
de WorkerBean alors tout fonctionne et WorkerBean peut accéder à UserInfo qui est injecté vers le bas. Toutefois, si j'utilise @Asynchronous
sur WorkerBean, l'injection cesse de fonctionner.Injection Java à l'intérieur @Bean asynchrone
Quelle est la meilleure façon de créer/transmettre manuellement UserInfo dans WorkerBean s'il doit être asynchrone?
// 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
}
}
Je pense que ce que vous cherchez n'est pas faisable, car WorkerBean sera initialisé au début de l'application tandis que UserData sera initialisé lors de l'obtention de la requête, donc au moment où WorkerBean est créé il n'y a pas UserData. –
Si je peux créer manuellement UserData et le peupler dans MainRs. Est-il possible d'injecter manuellement cette UserData dans WorkerBean? –
L'autre problème que vous avez est que UserData a un 'HttpServletRequest' intégré. Vous n'avez aucune garantie que votre implémentation serveur ne réutilisera pas cette demande pour desservir un autre client. Cela soulève des problèmes de sécurité –