2017-04-21 1 views
0

J'ai un module EJB avec une interface distante et un Enterprise Application Client (avec une bibliothèque qui inclut toutes les interfaces EJB distantes). Tout fonctionne correctement quand j'appelle n'importe quelle méthode d'affaires de l'EJB distant dans le client, excepté quand l'EJB doit me renvoyer un tableau d'objets. Donc, le transfert d'une chaîne fonctionne très bien, MAIS IL NE FONCTIONNERA PAS LORSQUE JE ESSAYE D'ENVOYER UN ENSEMBLE DE CORDES.retour tableau/collection dans EJB distant

Des idées sur ce ??? Ai-je besoin de créer un objet sérialisable comme celui-ci ?? ou quoi ?:

public class ArrayStrings() implements Serializable{ 
     private String[] arrayS; 
     ... 
} 

Je ne sais pas comment puis-je passer un tableau dans un appel ejb à distance. Des idées?

Trouver beuglement mon code:

@Stateless 
public class CategoryManagement extends AbstractFacade<Category> implements 
CategoryManagementRemote { 

@PersistenceContext(unitName = "On-lineSupermarketEJBPU") 
private EntityManager em; 

@Override 
protected EntityManager getEntityManager() { 
    return em; 
} 

public CategoryManagement() { 
    super(Category.class); 
} 

@Override 
public Category findCategoryByName (String name){ 

    try{ 
    Category c= (Category)em.createNamedQuery("Category.findByName").setParameter("name", name).getSingleResult(); 
    for (Product p: c.getProductCollection()){ 
     System.out.println(p.getName()); 
    } 
    return c; 
    }catch(NullPointerException e){}; 
    return null; 

} 

@Override 
public List<String> getProductCollectionGivenCategory (String name){ 
    Category c = findCategoryByName (name); 
    List<String> list=null; 
    for(Product p: c.getProductCollection()){ 
     list.add(p.getName()); 
    } 
    return list; 
} 

}

Ensuite, mon interface distante (qui est dans une bibliothèque jar dans le classpath du client):

@Remote 
public interface CategoryManagementRemote { 
    Category findCategoryByName (String name); 
    List<String> getProductCollectionGivenCategory (String name); 
} 

Et enfin, je appelez une méthode de l'interface CategoryManagementRemote pour simplement imprimer le tableau de chaînes dans le client:

public static void main(String[] args){ 
    try{ 
    InitialContext c = new InitialContext(); 
    CategoryManagementRemote cm = (CategoryManagementRemote) 
    c.lookup("java:global/On-lineSupermarketEJB/CategoryManagement"); 
    List<String> listProducts= 
    cm.getProductCollectionGivenCategory("Diary"); 
    for (String p: listProducts){System.out.println(p);} 
    catch(Exception e){}; 
} 

BTW I NE PAS OBTENIR D'ERREUR (Je suppose que le try/catch attrape l'exception en essayant de lire la liste des chaînes). Mais la liste n'est pas imprimée. (Je ne reçois pas la liste des chaînes dans le client (quand juste envoyer 1 seule chaîne cela fonctionne)

+0

S'il vous plaît montrer l'erreur réelle que vous obtenez et Les déclarations de méthode de l'interface distante et l'EJB réel –

+0

Eh bien, 'getProductCollectionGivenCategory' semble avoir un bogue qui se traduira par une exception NullPointerException ... Si vous avez consigné votre exception interceptée au lieu de l'avaler, vous l'avez peut-être vu –

+0

Si vous êtes en utilisant le lien Eclipse, essayez de regarder cette réponse à moi, j'ai passé des jours à essayer de trouver ce qui n'allait pas: http://stackoverflow.com/questions/36112224/jpa-entity-is-not-correctly-passed- de-ejb-to-presentation-tier/37249863 # 37249863 – Leonardo

Répondre

0

Résolu! Dans mon cas, je le tissage désactivé et il fonctionne maintenant

+0

Je me souviens encore de la frustration de ces jours, en essayant de trouver pourquoi les choses ne fonctionnaient pas comme prévu! Une autre suggestion consiste à utiliser Hibernate comme implémentation JPA. – Leonardo