8
votes

État de passage entre les méthodes d'EJB / @RequestScoped et @Statoire

J'ai un @RequestScopé CDI Bean que je veux devenir une EJB pour obtenir des transactions déclaratives. (Je suis sur EJB 3.1, Java EE 6)

Actuellement, je passe l'état entre les sous-routine, en supposant que l'instance n'est utilisée que dans une seule demande. Si j'ajoute @Statoire code> maintenant que l'hypothèse changerait. P>

Par exemple, je veux faire quelque chose comme p>

@Stateless
@Named
@RequestScoped
public class Foo {
  private String var1; // can't use instance vars in @Stateless?
  private String var2;

  public void transactionForRequest() {
    var1 = value; 
    var2 = value;
    ....
    subroutine();
  }
}
  • Utilisez @stateful au lieu de @Statoire, ainsi que @named et @RequestScoped. li>
  • GARDER @ Stateless et utilisez EJBContext.getContexTData ​​CODE> Carte pour remplacer les variables d'instance. LI> ul>

    meilleur? Et y a-t-il une autre alternative que je ne pense pas? (En plus d'attendre Java Ee 7 ou passer au ressort.: -)) P> P>


5 commentaires

Utiliser @Stateful peut être une sur-compétence. Avez-vous envisagé d'utiliser des haricots apatrides normaux et @ConversationsCoped Bean géré pour passer des états?


Comment cela fonctionnerait-il - feriez-vous l'EJB @Statoire alors @Inject un haricot CDI? Ce bean CDI pourrait-il être @RequestScoped ?


Je garderais le haricot comme @Statoire et utiliser @conversationsCoped haricoter pour passer des variables de pages aux pages. Découvrez ce Article sur la création de l'assistant .


Je n'essaie pas d'avoir une conversation comme une assistant - j'essaie de passer des variables entre les sous-routines dans le cadre d'une seule transaction HTTP Demande / DB.


Si tel est le cas, @sesstionsCoped haricot avec une haricot apatride peut toujours être plus facile à gérer que le haricot d'état.


3 Réponses :


1
votes

Si vous utilisez des haricots indépendants, vous êtes responsable de toute gestion de l'état et que vous le feriez normalement dans la couche Web-App à l'aide de HTTPSessions. Et oui, vous ne pouvez pas utiliser les variables d'instance car les haricots apurés sont regroupés.


0 commentaires

3
votes

J'irais avec SFSB au lieu de SLSB. Vous voulez organiser un état, donc pour moi, c'est l'information la plus importante - c'est un travail d'EJB d'état.

aussi je ne pense pas que ejbcontext # getcontextData () vous aiderait. Autant que je me souvienne, il n'est valable que pendant une durée d'un appel. Par conséquent, chaque appel d'une méthode sur votre EJB créera une nouvelle carte de données de contexte (au moins c'est ce que j'attendrais.)


2 commentaires

Content d'entendre @ Stateful + @RequestScoped travaillerait - pour une raison quelconque, une "session satellite" sonne "sonne toujours comme un mot sale, mais" Le haricot de la session de la requête "sonne bien mieux. Aussi - EJBContext # GetContextData () Fonctionne bien pour moi dans cette situation car le sous-programme est un appel de méthode local ( this.subroutin () ) plutôt que d'une invocation EJB.


Vous avez raison - si son appel local que les données de contexte conviennent. Je pensais que vous aviez injecté votre EJB ( @ejb ou @Inject ) et a appelé plusieurs méthodes sur l'instance proxy.



12
votes

tandis que @Statoire , @singleton et @MessageDroven peut avoir des références scopées injectées via @Inject , ils ne peut pas être @RequestScoped ou toute autre portée. Seul le modèle @stateful est suffisamment flexible pour supporter les champs. En d'autres termes, vous pouvez annoter la classe @stateful la classe de haricots en tant que @RequestScoped , @sessionsCoped , etc ..

en termes simples @Statoire , @singleton a déjà fixé "SCOPES" déjà. @singleton est essentiellement @ApplicationsCoped et @Statoire serait peut-être une portée intégrée comme @InvocationsCoped si cela existait. Le cycle de vie d'un haricot @MessageDroviven est entièrement jusqu'au connecteur qui la conduit et n'est donc pas autorisé à avoir une portée définie par l'utilisateur.

Voir aussi https://stackoverflow.com/a/8720148/190816


5 commentaires

David, juste pour être sûr - si j'ai @RequestScoped référence à @Statoire ejb - qu'est-ce que ça me achète? Je vais avoir la même référence pendant toute la demande, mais c'est toujours (probablement) une référence à la proxy, donc chaque fois que j'utilise cette référence, je peux terminer dans différentes instances d'EJB. Est-ce correct?


Exactement. Pour mettre en perspective, dans Openejb, nous ne créons qu'un proxy pour chaque haricot apuré et partager avec toute l'application. Idem pour singleton. Dans le cas de la mise en place de la demande (ou d'une autre portée) sur un apatride ou singleton, elle doit être traitée comme une erreur lors du déploiement. Je devrais vérifier les spécifications et TCK à ce sujet, mais c'est certainement la façon dont je le ferais. Tout le reste est juste trompeur.


Merci d'avoir clarifié David. C'est juste une autre fois lorsque la connexion entre EJB et CDI peut être désorientée ...


N'avait-on pas pensé à cela avant, mais il pourrait être intéressant de déclarer de manière rétroactive le singleton comme une forme de stéréotype et l'annotant avec des applicationsCopé. Pourrait être un peu plus claire que cela a en fait une portée et qu'une portée ne peut pas être modifiée.


Cela semble raisonnable. Il ne casse pas la spécification EJB et ne ferait que Singleton EJB juste un cas particulier de Bean CDI. J'espère que EE 7 réorganisera cette chose. Ce serait formidable s'il serait possible de mapper SLSB et SFSB sur un stéréotype CDI de telle manière. Ensuite, le contexte de la CDI ferait vraiment une partie centrale de chaque type de haricots dans EE.