class cast exception in engen eine jndi-reffrence in ejb
Ich bin versucht, zu schreiben eine einfache stateless sesssion Bohne aber ich habe ein problem mit schmalen Referenz gebe ich in lookup-Zeit.
Ich habe
Klasse cast Ausnahme
Benutze ich
eclipse IDE
meine bean-Klasse
package codes;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class SinaBean implements SessionBean {
/**
*
*/
private static final long serialVersionUID = 1L;
public String getHello()
{
return "hello";
}
public void ejbCreate(){
}
@Override
public void ejbActivate() throws EJBException, RemoteException {
//TODO Auto-generated method stub
}
@Override
public void ejbPassivate() throws EJBException, RemoteException {
//TODO Auto-generated method stub
}
@Override
public void ejbRemove() throws EJBException, RemoteException {
//TODO Auto-generated method stub
}
@Override
public void setSessionContext(SessionContext arg0) throws EJBException,
RemoteException {
//TODO Auto-generated method stub
}
}
mein home-Schnittstelle
package codes;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface SinaHome extends EJBHome {
public SinaObject create() throws RemoteException,CreateException;
}
meine Komponente
package codes;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface SinaObject extends EJBObject {
String getHello() throws RemoteException;
}
mein client
package codes;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
Context con=null;
try {
Properties p=new Properties();
p.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
p.setProperty(Context.PROVIDER_URL, "localhost:1099");
p.setProperty(Context.URL_PKG_PREFIXES,
"org.jboss.namingrg.jnp.interfaces");
con = new InitialContext(p);
Object o=con.lookup("SinaBean");
System.out.println(o);/***/untill know it works.it sysout :
//org.jnp.interfaces.NamingContext@e83912***
@SuppressWarnings("unused")
SinaHome sh=(SinaHome)PortableRemoteObject.narrow(o, SinaHome.class);//***exeption is here!!***
} catch (Exception e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
meine xml-Datei
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
<display-name>Ejb </display-name>
<enterprise-beans>
<session>
<display-name>SinaBean</display-name>
<ejb-name>SinaBean</ejb-name>
<home>codes.SinaHome</home>
<remote>codes.SinaObject</remote>
<ejb-class>codes.SinaBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
<security-identity>
<description></description>
<use-caller-identity></use-caller-identity>
</security-identity>
</session>
</enterprise-beans>
</ejb-jar>
Ausnahme, die ich erhalten
java.lang.ClassCastException
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:229)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)
at codes.Client.main(Client.java:27)
Caused by: java.lang.ClassCastException: org.jnp.interfaces.NamingContext cannot be cast to org.omg.CORBA.Object
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:212)
... 2 more
Werde ich sehr dankbar für Eure Ratschläge.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst, Ihre xml-Datei angibt, die Sie verwenden EJB3 (was ist eigentlich die einzige version, auch eine überlegung Wert), aber die Bohne ist ein EJB2-Beans zu.
Wenn Ihr server tatsächlich läuft EJB3, entfernen Sie die XML-Datei und entfernen Sie die unnötige EJB-home-und component-Implementierungen. Fügen Sie die
@Stateless
annotation und eine remote-Schnittstelle. Stellen Sie sicher, es sieht wie folgt aus:Korrigieren Sie die JNDI-Eigenschaften. Der folgende Code ist falsch:
p.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.namingrg.jnp.interfaces");
sollte es sein:
p.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
(die Varianten benutzen die Menschen hier sind fast endlos und es im Grunde immer funktioniert trotzdem, aber nur um sicher zu gehen verwenden Sie die richtige Variante)
Außerdem, und wahrscheinlich der Hauptgrund, bist du mit dem
ejb-name
als-ob-es war eine Globale JNDI-Namen, aber das ist nicht der Fall. Dieejb-name
ist etwas verwirrend, logischer name, die verwendet wird, als eine zusätzliche Art von qualifier, beim verweisen auf eine bestimmte bean bei der Injektion oder der Erstellung einer ejb-ref.In deinem Fall bist du die Einstellung die gleiche wie die unqualifizierten bean-name, was ist schon der Standard. Da
SinaBean
existiert, ich vermute, du bist nicht bereitstellen über ein OHR, aber Sie stellen eine eigenständige EJB-jar, richtig?Wenn Sie mit JBoss AS 6 (EJB3.1) Sie können die global portable JNDI-Namen, sonst wird die alte JBoss-spezifische JNDI-naming verwendet werden können:
[ear name]/[simple bean name]/remote
. Beachten Sie, dass [einfache bean-name] ist nicht die ejb-name, aber in Ihrem Fall, dass Sie zufällig die gleichen. Da[ear name]/
entfernt werden, wenn Sie den Einsatz nur eines EJB-jar, erklärt dies die Ausnahme, Sie sind immer:SinaBean
ist ein Verzeichnis (Kontext im JNDI-Bedingungen), die enthalten kann, die die eigentlichen Einträgelocal
,remote
undno-interface
. Was Sie tun, ist versuchen, um Besetzung dieser intermediate directory-Knoten, um den proxy zu deiner Bohne, was natürlich nicht funktioniert.Sowieso, schließlich entfernen Sie die Nutzung von
PortableRemoteObject
ist dies nicht mehr benötigt. Der client-code wird dann wie folgt Aussehen:Hier, Wenn Sie mit EJB 2.0 zusammen mit Jboss 5.0 und versuchen, Typ-cast Object obj zu Ihrem Home-Objekt vom Client wie unten, dann könnte es werfen java.lang.Classcastexception-Fehler com.Sonne.proxy.$Proxy104 kann nicht umgewandelt werden, org.omg.CORBA.Objekt .
Code lookup JNDI :
java.lang.Object obj = ctx.lookup("java:comp/env/ATSessionBean");
ATHome home = (ATHome) PortableRemoteObject.narrow(obj, ATHome.class);
Lösung : Hier u müssen, um zusätzliche jar-Dateien in classpath der Client-Anwendung (diese sind in der Höheren version von JBOSS.
So besser zum download der neuesten version **jboss-7.1.1.Letzte server und bereitstellen einer Anwendung, und es wird erfolgreich ausgeführt. :)**
laden Sie JBOSS server (Download EAP 6.4.0) von unten link : http://jbossas.jboss.org/downloads/