classe cast exception en étroite jndi reffrence dans ejb
Je suis en train d'écrire un simple apatrides sesssion bean, mais j'ai un problème avec d'étroites de référence, je donne en recherche de temps.
J'ai eu
classe fonte d'exeption
- Je utiliser
de l'IDE eclipse
mon haricot classe
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
}
}
mon interface d'accueil
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;
}
mon composant
package codes;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;
public interface SinaObject extends EJBObject {
String getHello() throws RemoteException;
}
mon 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();
}
}
}
mon fichier xml
<?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>
l'exception-je recevoir
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
Je serai extrêmement reconnaissant pour vos conseils.
OriginalL'auteur sara | 2011-07-25
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, votre fichier xml indique que vous utilisez EJB3 (qui est en fait la seule version vaut même pas vu), mais votre haricot est une EJB2 bean.
Si votre serveur, en effet, s'exécute EJB3, supprimer le fichier XML et de supprimer l'inutile EJB à la maison et le composant de mise en œuvre. Ajouter le
@Stateless
d'annotation et d'une interface à distance. Assurez-vous qu'il ressemble à quelque chose comme ceci:Corrigez votre JNDI propriétés. Le suivant est incorrect:
p.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.namingrg.jnp.interfaces");
il devrait être:
p.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
(les variantes d'utilisation de personnes ici sont presque infinies et il fonctionne toujours de toute façon, mais juste pour être sûr d'utiliser la variante correcte)
En outre, et probablement le principal coupable, vous êtes à l'aide de la
ejb-name
comme si c'était un nom JNDI global, mais ce n'est pas le cas. Leejb-name
est un peu déroutant nom logique qui est utilisé comme un supplément genre de qualificatif lors de la référence à un bean lors de l'injection ou de la création d'un ejb-ref.Dans votre cas, vous êtes un réglage à la même que la non qualifiés de haricots nom, qui est déjà la valeur par défaut. Depuis
SinaBean
existe, je devine que vous n'êtes pas le déploiement par l'intermédiaire d'une OREILLE, mais de déployer autonome jar EJB, droit?Si vous êtes à l'aide de JBoss 6 (EJB3.1) vous pouvez utiliser le mondiale portable noms JNDI, sinon le vieux JBoss spécifiques de nommage JNDI peut être utilisé:
[ear name]/[simple bean name]/remote
. Notez que [simple bean name] n'est pas l'ejb-name, mais encore une fois, dans votre cas, il s'agit d'être le même. Depuis[ear name]/
est supprimé lorsque vous déployez seulement un jar EJB, c'est ce qui explique l'exception que vous obtenez:SinaBean
est un répertoire (contexte dans JNDI), qui peut contenir les entrées réelleslocal
,remote
etno-interface
. Ce que vous faites est en train de jeter ce répertoire intermédiaire nœud de la procuration à votre bean, qui bien sûr ne fonctionne pas.De toute façon, enfin, de supprimer l'utilisation de
PortableRemoteObject
, c'est n'est plus nécessaire. Le code du client sera alors ressembler à ceci:Vous êtes les bienvenus 😉 Bonne chance avec votre code!
OriginalL'auteur Arjan Tijms
Ici Si vous utilisez EJB 2.0 avec Jboss 5.0 et en essayant de type cast de l'Objet obj, à votre Domicile, Objet de Client ci-dessous, alors qu'il pourrait jeter java.lang.ClassCastException com.soleil.proxy.$Proxy104 ne peut pas être lancé pour org.omg.CORBA.Objet .
Code lookup JNDI :
java.lang.Object obj = ctx.lookup("java:comp/env/ATSessionBean");
ATHome maison = (ATHome) PortableRemoteObject.narrow(obj, ATHome.class);
Solution : Ici u besoin d'ajouter d'autres pots dans le classpath de l'application Client sont disponibles dans Plus de la version de JBOSS.
Il est donc préférable de télécharger la dernière version **jboss-7.1.1.Final serveur et déployer votre application et il sera exécuté avec succès. :)**
télécharger serveur JBOSS (Télécharger EAP 6.4.0) lien ci-dessous : http://jbossas.jboss.org/downloads/
OriginalL'auteur Amit Thakur