2010-04-20 3 views
0

Je suis sûr que ce soit une erreur de débutant ...Servlet reçoit objet vide de session à distance EJB3 Bean

J'ai donc une application Java EE 6 avec des entités, des façades (mise en œuvre de la couche de persistance) et Stateless Session Beans (EJB3) avec des interfaces distantes (donnant accès aux entités via des façades).

Cela fonctionne très bien. Via le SLSB, je peux récupérer et manipuler des entités.

Maintenant, j'essaye de le faire à partir d'une application Web (déployée sur les mêmes définitions Glassfish, entité + interface de l'application Java EE importées en tant que jar séparé). J'ai une servlet, qui reçoit une instance de la SLSB injectée. Je reçois à récupérer une entité, et les événements suivants se (je peux le voir dans les journaux):

  • s'instancié la SLSB à distance, la méthode appelée
  • SLSB instancie la façade, appelle la « get » méthode
  • façade récupère instance de l'entité de DB, le renvoie
  • SLSB renvoie l'instance de l'entité à l'appelant
    • (tout est bon jusqu'à ici)
  • appel servlet reçoit .. un instance vide de l'entité !!

Qu'est-ce qui ne va pas? Cela devrait fonctionner, non?

myServlet:

public class MyServlet extends HttpServlet { 

    @EJB 
    private CampaignControllerRemote campaignController; // remote SLSB 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/plain"); 
    PrintWriter out = response.getWriter(); 
    try { 
     Campaign c = campaignController.getCampaign(5L); // id of an existing campaign 
     out.println("Got "+ c.getSomeString()); // is null !! 
    } finally { 
     out.close(); 
    } 
    } 
    ... 
} 

Pls laissez-moi savoir si vous voulez voir autre code, et je vais mettre à jour le poste.

+0

Est c l'objet null ou getsomestring retourne vide? Les journaux affichaient-ils la campagne '5L' entièrement remplie dans le SLSB avant que l'appel ne retourne au servlet? – JoseK

+0

@josek: 'c' existe, n'est pas nul. 'c.getSomeString()' renvoie null. Lorsque la SLSB récupère la campagne '5L', 'someString' est correctement renseigné. – Hank

+0

Je peux me tromper, mais pense que glassfish a besoin des interfaces distantes empaquetées dans la même webapp. – JoseK

Répondre

0

... oh boy, c'est un peu embarrassant ...

Il se trouve, je suis ignorant un petit avertissement bien en ce qui concerne l'utilisation de Vector comme type d'un champ qui contient une relation @xxToMany avec FetchType.LAZY:

élément [champ somefield] au sein classe d'entité [Campagne de classe] utilise un type de collection [classe java.util.Vector] lorsque la spécification JPA ne supporte que java.util.Collection, java.util.Set, java.util.List ou java.util.Map. Ce type est pris en charge avec impatient chargement ; en utilisant le chargement paresseux avec ce type de collection nécessite une configuration supplémentaire et une mise en œuvre IndirectContainer qui étend [classe java.util.Vector] ou le réglage de la cartographie utiliser indirection de base et du type à ValueholderInterface.

Deux solutions possibles peuvent corriger mon comportement:

  • utilisation FetchType.EAGER (alors je pourrais rester avec Vector)
  • utilisation List (comme la spécification dit ...)
Questions connexes