java – 在ejb中缩小jndi reffrence中的类强制转换异常

前端之家收集整理的这篇文章主要介绍了java – 在ejb中缩小jndi reffrence中的类强制转换异常前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试编写一个简单的无状态sesssion bean,但我在查找时给出了窄参考的问题.
我有

class cast exeption

我用

eclipse IDE

我的豆类

  1. package codes;
  2. import java.rmi.RemoteException;
  3.  
  4. import javax.ejb.EJBException;
  5. import javax.ejb.SessionBean;
  6. import javax.ejb.SessionContext;
  7.  
  8.  
  9. public class SinaBean implements SessionBean {
  10.  
  11.  
  12. /**
  13. *
  14. */
  15. private static final long serialVersionUID = 1L;
  16.  
  17. public String getHello()
  18. {
  19. return "hello";
  20. }
  21. public void ejbCreate(){
  22.  
  23. }
  24. @Override
  25. public void ejbActivate() throws EJBException,RemoteException {
  26. // TODO Auto-generated method stub
  27.  
  28. }
  29.  
  30. @Override
  31. public void ejbPassivate() throws EJBException,RemoteException {
  32. // TODO Auto-generated method stub
  33.  
  34. }
  35.  
  36. @Override
  37. public void ejbRemove() throws EJBException,RemoteException {
  38. // TODO Auto-generated method stub
  39.  
  40. }
  41.  
  42. @Override
  43. public void setSessionContext(SessionContext arg0) throws EJBException,RemoteException {
  44. // TODO Auto-generated method stub
  45.  
  46. }
  47.  
  48. }

我的家庭界面

  1. package codes;
  2.  
  3. import java.rmi.RemoteException;
  4.  
  5. import javax.ejb.CreateException;
  6. import javax.ejb.EJBHome;
  7.  
  8. public interface SinaHome extends EJBHome {
  9.  
  10. public SinaObject create() throws RemoteException,CreateException;
  11. }

我的组件

  1. package codes;
  2.  
  3. import java.rmi.RemoteException;
  4.  
  5. import javax.ejb.EJBObject;
  6.  
  7. public interface SinaObject extends EJBObject {
  8.  
  9. String getHello() throws RemoteException;
  10. }

我的客户

  1. package codes;
  2.  
  3. import java.util.Properties;
  4.  
  5. import javax.naming.Context;
  6. import javax.naming.InitialContext;
  7. import javax.naming.NamingException;
  8. import javax.rmi.PortableRemoteObject;
  9.  
  10. public class Client {
  11.  
  12. /**
  13. * @param args
  14. */
  15. public static void main(String[] args) {
  16. Context con=null;
  17. try {
  18. Properties p=new Properties();
  19. p.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
  20. p.setProperty(Context.PROVIDER_URL,"localhost:1099");
  21. p.setProperty(Context.URL_PKG_PREFIXES,"org.jboss.namingrg.jnp.interfaces");
  22. con = new InitialContext(p);
  23. Object o=con.lookup("SinaBean");
  24. System.out.println(o);/***/untill know it works.it sysout :
  25. //org.jnp.interfaces.NamingContext@e83912***
  26.  
  27. @SuppressWarnings("unused")
  28. SinaHome sh=(SinaHome)PortableRemoteObject.narrow(o,SinaHome.class);//***exeption is here!!***
  29. } catch (Exception e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. }
  33.  
  34.  
  35. }
  36.  
  37. }

我的xml文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <display-name>Ejb </display-name>
  4. <enterprise-beans>
  5.  
  6. <session>
  7.  
  8. <display-name>SinaBean</display-name>
  9. <ejb-name>SinaBean</ejb-name>
  10. <home>codes.SinaHome</home>
  11. <remote>codes.SinaObject</remote>
  12. <ejb-class>codes.SinaBean</ejb-class>
  13. <session-type>Stateless</session-type>
  14. <transaction-type>Bean</transaction-type>
  15.  
  16. <security-identity>
  17. <description></description>
  18. <use-caller-identity></use-caller-identity>
  19. </security-identity>
  20.  
  21. </session>
  22.  
  23. </enterprise-beans>
  24.  
  25. </ejb-jar>

我收到的例外

  1. java.lang.ClassCastException
  2. at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:229)
  3. at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)
  4. at codes.Client.main(Client.java:27)
  5. Caused by: java.lang.ClassCastException: org.jnp.interfaces.NamingContext cannot be cast to org.omg.CORBA.Object
  6. at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:212)
  7. ... 2 more

我将非常感谢您的建议.

解决方法

首先,您的xml文件表明您正在使用EJB3(实际上这是唯一值得考虑的版本),但您的bean是EJB2 bean.

如果您的服务器确实运行EJB3,请删除XML文件删除不必要的EJB主目录和组件实现.添加@Stateless注释和远程接口.确保它看起来像这样:

  1. @Remote
  2. public interface SinaRemote {
  3. String getHello();
  4. }
  5.  
  6. @Stateless
  7. public class SinaBean implements SinaRemote {
  8.  
  9. public String getHello() {
  10. return "hello";
  11. }
  12. }

然后更正您的JNDI属性.以下是错误的:

p.setProperty(Context.URL_PKG_PREFIXES,“org.jboss.namingrg.jnp.interfaces”);

它应该是:

p.setProperty(Context.URL_PKG_PREFIXES,“org.jboss.naming:org.jnp.interfaces”);

(人们在这里使用的变体几乎是无穷无尽的,无论如何它基本上总是有效,但只是为了确保使用正确的变体)

此外,并且很可能是主要的罪魁祸首,你使用的是ejb-name,如果它是一个全局JNDI名称,但实际情况并非如此. ejb-name是一个有点令人困惑的逻辑名,在注入或创建ejb-ref时引用特定bean时用作额外的限定符.

在您的情况下,您将其设置为与非限定bean名称相同,该名称已经是默认值.由于SinaBean存在,我猜你不是通过EAR部署,而是部署一个独立的EJB jar,对吗?

如果您使用的是JBoss AS 6(EJB3.1),则可以使用global portable JNDI names,否则可以使用旧的JBoss特定JNDI命名:[ear name] / [simple bean name] / remote.请注意,[简单bean名称]不是ejb-name,但在您的情况下,它们恰好相同.由于[ear name] /在您仅部署EJB jar时被删除,这解释了您获得的异常:SinaBean是一个目录(JNDI术语中的上下文),它可以包含本地,远程和没有的实际条目接口.你正在做的是尝试将这个中间目录节点转换为你的bean的代理,这当然不起作用.

无论如何,最后,删除PortableRemoteObject的用法,这是no longer needed.客户端代码将如下所示:

  1. Properties properties = new Properties();
  2. properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");
  3. properties.setProperty(Context.URL_PKG_PREFIXES,"org.jboss.naming:org.jnp.interfaces");
  4. properties.setProperty(Context.PROVIDER_URL,"localhost:1099");
  5. context = new InitialContext(properties);
  6. SinaRemote sina = (SinaRemote) context.lookup("SinaBean/remote");

猜你在找的Java相关文章