Hilfe bei EJB! Client soll auf remote methoden zugreifen

enrix

Mitglied
Hallo,
ich habe die Frage schon einmal gepostet aber ich glaube es ist unhöflich von mir jemand fremdes zu zumuten solch lange fragen zu beantwoteten. drum fasse ich mich kurz.
wie kann ich einem webclient oder application-client dazu bringen, auf die EJB remote methoden zuzugreifen? Wie erfolgt die referenzierung zwischen den containern (EJB und app-client )?

bin für jede hilfe sehr dankbar
mfg!
enrix
 
Zuletzt bearbeitet:
Hier die Kurzform:

Business-Interface
Java:
public interface IMyBean {
   doSth();
}

Session-Bean
Java:
@Stateless
// oder @Statefull
@Remote(IMyBean.class)
public class MyBean implements IMyBean {
   doSth() {
      //...
   }
}

Einfach(st)er Client
Java:
public class MyClient {
   public static void main(String[] args) throws NamingException {
      Properties properties = new Properties();
      properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.security.jndi.LoginInitialContextFactory"); // bzw. von deinem Server
      properties.put(Context.URL_PKG_PREFIXES, "=org.jboss.naming:org.jnp.interfaces"); // bzw. von deinem Server
      properties.put(Context.PROVIDER_URL, "localhost:1099"); // bzw. von deinem Server
      Context context = new InitialContext(properties);
		
      IMyBean bean = (IMyBean) context.lookup("MyBean/remote");
      bean.doSth();
   }
}

Grüße,
Sebastian
 
Zuletzt bearbeitet:
danke für eure schnelle Hilfe. Bei mir hat es jetzt auch geklappt indem ich den Initialisierungs Punkt für eine lookup-funktion gesetzt habe. Komischerweise, steht das nicht in der sun-dokumentation über glasfish. möglicherweise habe ich ber auch was überlesen. ich habe meine klasse für den application client also um folgende funktion erweitert:
Code:
protected void setUp(){
    try{
        //Einstiegspunkt, von dem aus die
        //Suche nach dem JNDI-Namen begonnen werden kann
        InitialContext context = new InitialContext();
        converter= (ConverterInterface) context.lookup(ConverterInterface.class.getName());
        System.out.println("na das hat aber geklappt "+context.lookup(ConverterInterface.class.getName())); 
        
    }catch(Exception ex){
       System.out.println("Der Einstiegspunkt InitialContext verursacht eine Fehler "+ex.getMessage());
    }
}

was ich noch nicht ganz verstehe, ist das JNDI-Prinzip. Ich nehme an, dass Sebastian mit dem Objekt Properties eine Referenz auf sein Interface erzeugt. Anscheinend gibt es für die Referenzierung mehrere Möglichkeiten denn ich verwende nur den InitialContex. Inwiefern ist es wichtig, ein Properties-Objekt zu verwenden? Könnte mir vorstellen, dass es dann eingesetzt wird wenn application client und EJB auch physisch von einander getrennt sind und sich im gleichen Netzwerk befinden.
 
In einfachen Fällen reicht es tatsächlich nur den InitialContext mit dem Standard-Konstruktor zu erzeugen.

Wenn du aber z.B. auf einen speziellen JNDI-Server zugreifen willst auf dem deine Session-Beans gebunden sind, muss man in der sogenannten Environment die URL angeben und eine Factory die das Objekt für den Zugriff auf den JNDI-Context erstellen soll.
Ein weiterer Fall, wo man die Environment braucht ist z.B. wenn man die JAAS-Authentifizierung nutzen will. Dann kann man dem InitialContext den Benutzername und das Passwort mitgeben (siehe statische Konstanten von Context).

Es ist wohl auch möglich, die Environment in einer jndi.properties anzugeben und dann den Standard-Konstruktor zu benutzen. Die muss dann nur im classpath des Projekts liegen. Das hab ich aber noch nicht ausprobiert.

Wenn man z.B. in Eclipse einen Server startet kann es sein, dass eine jndi.properties aus einer der vielen jars der Serverumgebung genutzt wird. Das müsste man aber noch mal nachforschen wenn man Zeit hat ;)
 

Neue Beiträge

Zurück