2017-10-01 13 views
0

Actuellement, nous avons une structure d'objet POJO élaborée pour gérer une requête de service Web, appelée «processeur».Injecter CDI dans des requêtes de beans de session sans état

EJB distant et local et PersistenceContext appelés lors du traitement de cette requête sont initialisés dans le bean sans état et remis à ce constructeur 'processeurs' qui est recréé lors de chaque requête de service web.

Si je ne veux pas revenir aux recherches JNDI au fond de mon «processeur», je continue à faire glisser tous ces EJB à travers mon code.

Entrez CDI. Je voudrais pouvoir injecter ces EJB chaque fois que j'en ai besoin dans ce «processeur».

Cependant, j'ai également remarqué que cela signifie que le 'processeur' actuel doit devenir un bean CDI itselve: ainsi, en utilisant le @Inject dans le bean de session sans état qui implémente le webservice. Lorsque je fais cela, le cycle de vie complet du processeur devient lié au bean et non à la demande de son service. Soudain, je dois prendre en considération que je ne devrais pas conserver l'état (autre que les objets injectés) dans le processeur, puisque cet état sera partagé entre plusieurs invocations de service Web. En tant que programmeur, cela ne me rend pas la vie plus facile.

Alors, comment dois-je procéder? J'ai lu à propos de la portée mais je ne suis pas sûr de savoir si/comment cela m'aiderait.

exemple, le haricot sans état:

@Stateless 
@WebService 
public class ExampleBean { 

    @Inject 
    Processor requestScopedInstance; 

    int beanDependentScopeCounter; 

    public String sayHello() { 
     System.out.println("bean object id: " + this.toString()); 
     return requestScopedInstance.sayHello(beanDependentScopeCounter++); 
    } 
} 

Interface:

public interface Processor { 

    String sayHello(int beanScopedCounter); 
} 

mise en œuvre:

public class ProcessorImpl implements Processor { 

    private int requestScopedCounter = 0; 

    @Override 
    public String sayHello(int beanScopedCounter) { 
     return "test, requestScoped: " + requestScopedCounter++ + ", beansScoped: " + beanScopedCounter; 
    } 

} 

Répondre

1

When I do this the entiry lifecycle of the processor becomes bound to the bean and not to the request its serving qui ne soit pas correcte. C'est seulement le cas si vous n'utilisez pas @ApplicationScoped, @SessionScoped, @RequestScoped.

Alors:

  • annoter vos processeur avec @RequestScoped.
  • Vous n'avez pas besoin de remettre les EJB, vous pouvez simplement les injecter, si nécessaire.
  • Utilisez les méthodes annotées @PostConstruct pour le code constructeur qui utilise des objets injectés.
  • Les POJO sans état peuvent être annotés @ApplicationScoped, les POJO non stateless peuvent rester dépendants, ce qui est par défaut.

Cela est rendu possible parce que les proxies sont injectés, pas les haricots réels. En utilisant ces proxies, CDI s'assure que la portée correcte est utilisée pour vos appels particuliers.

+0

merci .. J'ai ajouté un exemple. Ajouter simplement @ @ RequestScope au-dessus de 'ProcessorImpl' a résolu mon problème. – sjaak