Anfänger Problem

Status
Nicht offen für weitere Antworten.

Snake87

Mitglied
Hallo Leute,

beschäftige mich seit kurzen mit EJB 3.0 und komme gerade nicht weiter.
Ich verwende als Application Server JBoss 5.0 und ich wenn die die Application über Eclipse ausführe bekomme ich folgende Fehlermeldung:

Code:
Exception in thread "main" java.lang.ClassCastException: org.jnp.interfaces.NamingContext cannot be cast to Zinsrechner
	at ZinsClient.main(ZinsClient.java:13)

Zinsrechner.java:
Java:
import javax.ejb.Remote;

@Remote
public interface Zinsrechner {

	public double berechneSparSumme(int anlagebetrag,int jahre,double zinssatz);}

ZinsrechnerImpl.java:
Java:
import javax.ejb.Stateless;

@Stateless(name="zinsrechner")

public class ZinsrechnerImpl implements Zinsrechner {

	
	public double berechneSparSumme(int anlagebetrag, int jahre, double zinssatz) {
		// TODO Auto-generated method stub
		return Math.pow(anlagebetrag *(1+zinssatz), jahre);
	}
}

Zinsclient.java:
Java:
import java.util.Properties;
import javax.naming.InitialContext;

public class ZinsClient {

	public static void main(String[] args) throws Exception {
		
		Properties props = new Properties();
		props.put("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
		props.put("java.naming.provider.url", "jnp://localhost:1099");
		InitialContext context = new InitialContext(props);		
		Zinsrechner hello = (Zinsrechner)context.lookup("zinsrechner");
		System.out.println(hello.berechneSparSumme(2000, 10, 2.3));
	}
}
 
S

SlaterB

Gast
muss der Zinsrechner nicht irgendwann irgendwo in den InitialContext eingefügt/ registriert werden?
an der Stelle passiert vielleicht der Fehler, dass ein falsches Objekt abgelegt wurde,

oder soll dies durch die Annotation @Stateless(name="zinsrechner") automatisch geschehen?
 

Snake87

Mitglied
Die Annotation wird doch registriert...

Java:
 Zinsrechner hello = (Zinsrechner)context.lookup("zinsrechner");

Oder hab ich da was falsch verstanden, wenn ja wäre es schön wenn du mir es bitte mal erklären könntest.

LG
 
S

SlaterB

Gast
ein Lookup ist ein Herausholen, sowas wie get auf eine Liste,
aber die Liste darf nicht leer sein, vorher muss jemand was reinlegen,

das erfordert meiner Meinung nach Code, der dann den Fehler verursachen könnte,
indem ein anderes Objekt unter dem fraglichen Namen abgelegt ist
 

Snake87

Mitglied
Also so richtig hab das noch nicht verstanden.... Also das ich mit lookup etwas aufrufe ist mir schon klar... aber... wieso ist die "liste" leer?
Also ich habe das so verstanden mit dem
Code:
@Stateless(name="zinssatz")
:
Wenn ich nur schreiben würde
Code:
@Stateless
würde EJB hat die Default Einstellungen laden... Und dann müsste ich das lookup folgendermaßen schreiben:
Java:
Zinsrechner hello = (Zinsrechner)context.lookup("ZinsrechnerImpl/remote");

Aber da ich ja nun @Stateless(name="zinssatz") geschrieben habe schreibe ich statt
ZinsrechnerImpl/remote zinssatz!

Aber irgendwie finde ich meine Erklärung unlogisch bzw. bin mir nicht sicher ob ich damit so richtig liege.

das erfordert meiner Meinung nach Code
würdest du mir verraten welcher Code, also was da hin kommt....


Hoffe du weißt jetzt wo mein Problem liegt....

LG
 
S

SlaterB

Gast
nun ist klar, dass das Objekt durch die Annotation registriert werden soll, hatte ich ja im ersten Posting nachgefragt,
was daran nun richtig oder falsch ist kann ich dann leider nicht nachvollziehen,


-------

altmodisch kenne ich nur Code wie
> Registry registry = LocateRegistry.getRegistry(port);
> registry.bind(name, object);

wenn man die Objekte selber registriert und überprüfen und loggen kann, welches Objekt von welchem Typ unter genau welchem Namen abgelegt ist,
dann sollte man bei einem lookup weniger Überraschungen erleben oder diese zumindest im Nachhinein herausfinden können
 

Snake87

Mitglied
Hi,

hab es nun hinbekommen und das war gar nicht so kompliziert wie gedacht.
Man musste einfach nur noch /remote mit hin schreiben, weil anscheinend weiß er nicht von alleine das die Komponente von außer Zugriffen werden soll/darf.

Also die Lösung zu dem Problem sieht folgendermaßen aus:

Java:
Zinsrechner hello = (Zinsrechner)context.lookup("zinsrechner/remote");

Und danke dir!!:)

LG
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben