исключение класса броска в узкой референции jndi в ejb - PullRequest
7 голосов
/ 25 июля 2011

Я пытаюсь написать простой bess-компонент без сохранения состояния, но у меня проблема с узкой ссылкой, которую я даю во время поиска.Я получил

исключение приведения класса

Я использую

IDE затмения

мой класс бинов

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

    }

}

мой домашний интерфейс

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;
}

мой компонент

package codes;

import java.rmi.RemoteException;

import javax.ejb.EJBObject;

public interface SinaObject extends EJBObject {

    String getHello() throws RemoteException;
}

мой клиент

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();
        }


    }

}

мой 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>

Исключение, которое я получаю

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

Буду чрезвычайно признателен за ваши советы.

Ответы [ 2 ]

7 голосов
/ 25 июля 2011

Прежде всего, ваш xml-файл указывает, что вы используете EJB3 (что на самом деле является единственной версией, даже заслуживающей рассмотрения), но ваш бин - это EJB2-бин.

Если на вашем сервере действительно работает EJB3, удалите файл XML и удалите ненужные реализации EJB home и компонентов. Добавьте аннотацию @Stateless и удаленный интерфейс. Убедитесь, что это выглядит примерно так:

@Remote
public interface SinaRemote {
    String getHello();
}

@Stateless
public class SinaBean implements SinaRemote {

    public String getHello() {
        return "hello";
    }
}

Затем исправьте свои свойства 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.

В вашем случае вы устанавливаете его так же, как и неквалифицированное имя компонента, которое уже используется по умолчанию. Поскольку существует SinaBean, я предполагаю, что вы не развертываете через EAR, а развернете автономный EJB-файл, верно?

Если вы используете JBoss AS 6 (EJB3.1), вы можете использовать глобальные переносимые имена JNDI , в противном случае можно использовать старое специфичное для JBoss наименование JNDI: [ear name]/[simple bean name]/remote. Обратите внимание, что [простое имя bean-компонента] не является ejb-именем, но опять же в вашем случае они оказались одинаковыми. Поскольку [ear name]/ удаляется при развертывании только файла EJB, это объясняет исключение, которое вы получаете: SinaBean - это каталог ( context в терминах JNDI), который может содержать реальные записи local, remote и no-interface. То, что вы делаете, пытается преобразовать этот промежуточный узел каталога в прокси к вашему бину, что, конечно, не работает.

В любом случае, наконец, удалите использование PortableRemoteObject, это больше не нужно . Код клиента будет выглядеть следующим образом:

Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
properties.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
properties.setProperty(Context.PROVIDER_URL, "localhost:1099");
context = new InitialContext(properties);
SinaRemote sina = (SinaRemote) context.lookup("SinaBean/remote");
0 голосов
/ 07 мая 2015

Здесь Если вы используете EJB 2.0 вместе с Jboss 5.0 и пытаетесь набрать приведение Object obj к вашему Домашнему объекту из клиента, как показано ниже, это может привести к java.lang.ClassCastException com.sun.proxy. $ Proxy104 не может быть приведенным к org.omg.CORBA.Object .

Код для поиска JNDI: java.lang.Object obj = ctx.lookup ("java: comp / env / ATSessionBean"); ATHome home = (ATHome) PortableRemoteObject.narrow (obj, ATHome.class);

Решение: Здесь вам нужно добавить дополнительные jar-файлы в classpath клиентского приложения, которые доступны в более высокой версии JBOSS. Так что лучше скачать последнюю версию сервера ** jboss-7.1.1.Final и развернуть приложение, и оно будет успешно запущено. :) ** загрузить сервер JBOSS (загрузить EAP 6.4.0) по ссылке ниже: http://jbossas.jboss.org/downloads/

...