# ejb @Remote macht probleme



## Mr.y (21. Okt 2012)

Hallo, ich möchte meine ejb-klasse auch für entfernte Computer erreichbar machen,
daher hab ich der  stateless-ejb nen "@remote"-Interface verpasst, sonst hab ich werde was in irgendwelchen .xml´s noch wo anders irgendwas eingestellt.

Beim Zugriff habe ich nen Datentypen von der Schnittstelle definiert:

KlasseA:


```
private Schnittstelle meineSchnittstelle
```

dann rufe ich sie auf:


```
meineSchnittstelle.suche(String name)
```

dann geht er in die entsprechende ejb, sucht, findet und gibt zurück...(was ja auch vor her geklappt hat)
nun aber, passiert beim zurückgeben von einer gefüllten Liste ein komischer Fehler:



> description: The server encountered an internal error () that prevented it from fulfilling this request.
> 
> exception
> 
> ...



Hätte da jemand ne Idee, was das sein könnte, irgendwas stimmt mit der aufstellung von so genanntem "remote call header" (laut doku)?
Danke im Voraus


----------



## Mr.y (29. Okt 2012)

keiner weiss was?


----------



## JimPanse (29. Okt 2012)

Mr.y hat gesagt.:


> Hallo, ich möchte meine ejb-klasse auch für entfernte Computer erreichbar machen,


 :autsch:



Mr.y hat gesagt.:


> sonst hab ich werde was in irgendwelchen .xml´s noch wo anders irgendwas eingestellt.


:shock:


Wie greifst du auf die Bean zu? Von einer anderen Bean (aus einem anderem Java EE Projekt) oder über einen Service Locator in einer Java SE Application? JNDI Parameter richtig gesetzt? Was benutzt du? Einen JBoss AS oder Glassfish? Welche version des AS? Welche EJB version 3 oder 3.1... 

???:L???:L???:L???:L???:L???:L


----------



## Mr.y (29. Okt 2012)

sorry, für die wenige info.



> Wie greifst du auf die Bean zu?



Ich injeziere die stateless-bean von der logic-schicht in die SessionScoped  der "BackingBean" Schicht vom Martin Flower.

Und ich habe das gefühl, dass diese ejb-bean nicht mehr an dem Kontext dranhängt...



> JNDI Parameter richtig gesetzt?


Muss man das bei einer Web-Anwendung auch machen? ich hab bisher mit JNDI gar nix gemacht.

Ich nutze Glassfish.
Ich habe eine Webanwendung, d.h. ich gebe die URL einfach im browser ein und es erscheint alles, bis ich das auf @remote umgestellt habe.
Welche ejb-version ich habe....ich weiss das net so recht, vermutlich die neuste, wo kann ich das nachschauen?

Danke schon mal


----------



## JimPanse (29. Okt 2012)

Mr.y hat gesagt.:


> Ich injeziere die stateless-bean von der logic-schicht in die SessionScoped  der "BackingBean" Schicht vom Martin Flower.



Martin Flower??? Martin Fowler meinst du oder? Kenne ich jetzt eher aus dem Bereich Refactoring...

EJB FAQ &mdash; Java.net


> I have a Remote EJB dependency (@EJB or <ejb-ref>) in my Java EE component.  How do I control which actual target EJB component it refers to?
> 
> If the target EJB component is defined within the same application as your referencing component and there is only one target EJB component within the application that exposes the remote interface associated with your EJB dependency, then the mapping will happen automatically.   In this case, there is no need to specify any additional mapping information.



Wenn ich es richtige verstehe erfolgt der Zugriff im gleichen ear und du willst  nur mal mit Remote rum testen. Sieht das ganze so aus:


```
@SessionScope
@ManagedBean
public class DeineJSFBean implements Serializable {
@EJB
private Schnittstelle meineSchnittstelle
}
```


```
@Stateless // oder @Remote(value = Schnittstelle.class)
public class DeineEJBBean implements Schnittstelle;
@Remote
public interface Schnittstelle;
```

Ansonsten der Anleitung folgenen zum Thema mapping.

Greetz


----------



## Mr.y (29. Okt 2012)

joa, den hab ich gemeint 

ich hab irgendwie gedacht, dass ich nur bei der Schnittstelle selbst die Annotation @remote angeben soll:


```
@Remote
public interface IRemoteInterface extends Serializable{

    public void persist(Object object);
```

wenn ich nun @remote bei der ejb auch angebe:


```
@Stateless //ist nun eine EJB
@Remote(value= IRemoteInterface.class)
    
public class ProjektService implements IRemoteInterface {
    
  
    @PersistenceContext(unitName = "ProjektPU")
    private EntityManager em;
```

dann passiert der selbe Fehler in der internen java-klasse:
*Method.java* in der Methode* invoke *
wo er das ganze zurück an die SessionScoped Bean geben will:


```
return ma.invoke(obj, args);
```

Im Error-Stack steht ganz unten auch:


> java.lang.NullPointerException


Also nehme ich stark an, dass er den Kontext (SessionScoped) net mehr kennt bzw. nicht mehr injezieren lässt....

Ich hab noch die JNDI in meine web.xml eingebunden, um die Datenbank noch mal explizit unter meiner lokalen IP anzugeben, aber das funktioniert soweit alles, weil er die gefunden Einträge zurückgeben möchte...


----------



## JimPanse (29. Okt 2012)

Ey sorry,

ich bin ja schon kein Goethe aber deine "Sätze" zu lesen und verstehen :shock:

Ich glaube es liegt einige Missverständnis deiner Seits vor. Poste doch einfach mal *nur* den relavanten Code, weil 

1. JNDI-DS in die web.xml einztragen macht bei einer Container gemanagen Anwendung keinen Sinn
2. Aufruf der EJBean in einer internen Klassen -> was meinst du damit?


----------



## Mr.y (29. Okt 2012)

hehe^^

also:

Interface Code sieht so aus:

```
public interface IRemoteInterface extends Serializable{

    public List<Projekt> findProjekt(String strname) throws Exception;
```

Dann wird in der KontextBean die passende Methode aufgerufen:


```
@Named
@SessionScoped
public class EJBVerdrahtung implements Serializable {
@EJB
private IRemoteInterface mIProjekt;  //Typ der Schnittstelle deklarieren
//Hier rufe über mIProjekt die passende "findProjekt"-Methode der EJB auf. Die sucht //wiederrum...findet..will zurückgeben:
//Aufruf:
public List<Projekt> projektPresent(String strProjekt) throws meineException {
      lstProjektListe = mIProjekt.findProjekt(strProjekt);
}
```

Ejb sieht so aus:

```
@Stateless 
@Remote(value= IRemoteInterface.class)
public class ProjektService implements IRemoteInterface {

@Override
public List<Projekt> findProjekt(String strname)  throws Exception {
        List<Projekt> lstResutlList = null;
        try {
            
            TypedQuery<Projekt> createNamedQuery = null;
            if (strname.isEmpty()) {
                createNamedQuery = em.createNamedQuery(Projekt.FIND_PROJEKT, Projekt.class);
            }else
            {
                createNamedQuery = em.createNamedQuery(Projekt.FIND_BY_NAME, Projekt.class);
                //Dann Parameter setzen, wonach ich suche
                createNamedQuery.setParameter("strname", strname).setMaxResults(1);
            }

            //Ergebnis anfordern
            
            if (!createNamedQuery.getResultList().isEmpty()) {
               
                lstResutlList = new ArrayList<Projekt>();
                lstResutlList = createNamedQuery.getResultList();
               
            }

            return lstResutlList;//FEHLER PASSIERT GENAU HIER, ABER ER GEHT IN KEINE EXCEPTION
    }
}
```


----------



## JimPanse (29. Okt 2012)

BTW: Remote-Interfaces müssen nicht serialisiert werden.


```
public List<Projekt> findProjekt(String strname)  throws Exception { // int firstResult, int maxResult
        List<Projekt> lstResutlList = null;
        try {
            
// DAS KANN EINEN NPE AUSLÖSEN strname.isEmpty() -> strname = null

            TypedQuery<Projekt> createNamedQuery = null;
           
 if (strname != null && strname.isEmpty()) { // besser
                createNamedQuery = em.createNamedQuery(Projekt.FIND_PROJEKT, Projekt.class);
            }else
            {
                createNamedQuery = em.createNamedQuery(Projekt.FIND_BY_NAME, Projekt.class);
                //Dann Parameter setzen, wonach ich suche
                createNamedQuery.setParameter("strname", strname); 

// NA WENN ÜBERGIBT MAN EIN FIRSTRESULT UND EIN MAXRESULT
//createNamedQuery.setMaxResults(1);
            }
 
            //Ergebnis anfordern -> RICHTIG ABER
// createNamedQuery.getResultList() -> holt das Ergebnis aus der DB und wandelt es um 
// ABER WARUM x2???
            /*   UNNÖTIG
 if (!createNamedQuery.getResultList().isEmpty()) {
               
                lstResutlList = new ArrayList<Projekt>();
                lstResutlList = createNamedQuery.getResultList();
               
            }*/
 
   lstResutlList = createNamedQuery.getResultList();

            return lstResutlList;//FEHLER PASSIERT GENAU HIER, ABER ER GEHT IN KEINE EXCEPTION

// WAS FÜR EIN FEHLER??? DER NPE (was ich nicht glaube) ODER DER MARSHALLING FEHLER????
    }
```

Interessant wäre noch wo die Methode -findProjekt("string") in der SessionBean aufgerufen wird.


----------



## Mr.y (29. Okt 2012)

Der ganze Fehler-Stack:




> type Exception report
> 
> message
> 
> ...






> Interessant wäre noch wo die Methode -findProjekt("string") in der SessionBean aufgerufen wird.



äähhmm...in der 9ten Zeile des zweiten Codeabschnittes:



> lstProjektListe = mIProjekt.findProjekt(strProjekt);



wie gesagt, das hat local alles funktioniert, nur mit Remote geht da was nicht....


----------



## JimPanse (31. Okt 2012)

Sorry hab jetzt nicht weiter nachgeforscht aber schau dir das mal an
jpa2-one-to-many-serialization-exception.


----------

