#weblogic #rmi #jndi #weblogic-10.x
#weblogic #rmi #jndi #weblogic-10.x
Вопрос:
Я пытаюсь выполнить поиск класса PublicRepository из EJB на сервере Weblogic 10. Это фрагмент кода:
/**
* RMI/IIOP clients should use this narrow function
*/
private static Object narrow(Object ref, Class c) {
return PortableRemoteObject.narrow(ref, c);
}
/**
* Lookup the EJBs home in the JNDI tree
*/
private static PublicRepository lookupHome() throws NamingException {
// Lookup the beans home using JNDI
Context ctx = getInitialContext();
try {
Object home = ctx.lookup("cea");
return (PublicRepository) narrow(home, PublicRepository.class);
} catch(NamingException ne) {
System.out.println("The client was unable to lookup the EJBHome. Please make sure ");
System.out.println("that you have deployed the ejb with the JNDI name "
"cea" " on the WebLogic server at " "iiop://localhost:7001");
throw ne;
}
}
private static Context getInitialContext() throws NamingException {
try {
// Get an InitialContext
Properties h = new Properties();
h.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
h.put(Context.PROVIDER_URL, "iiop://localhost:7001");
return new InitialContext(h);
} catch(NamingException ne) {
System.out.println("We were unable to get a connection to the WebLogic server at " "iiop://localhost:7001");
System.out.println("Please make sure that the server is running.");
throw ne;
}
}
Однако я получаю приведенное исключение:
Exception in thread "main" java.lang.ClassCastException
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(Unknown Source)
at javax.rmi.PortableRemoteObject.narrow(Unknown Source)
at vrd.narrow(vrd.java:67)
at vrd.lookupHome(vrd.java:80)
at vrd.main(vrd.java:34)
Caused by: java.lang.ClassCastException: weblogic.corba.j2ee.naming.ContextImpl
... 5 more
Прав ли я, когда использую приведенный выше код для повторного поиска определенного класса, который будет использоваться в моем клиентском приложении? Как я мог бы избавиться от исключения приведения?
Комментарии:
1. Можете ли вы предоставить полный код для класса вместе с путем к классу вашего клиентского приложения? Пакет, на который ссылается исключение, выглядит подозрительно.
2. Какую версию EJB вы пытаетесь найти? Это EJB 3? EJB2? Также с помощью weblogic 10.x вы можете рассмотреть возможность использования аннотаций для получения ссылок на EJB. Не могли бы вы, пожалуйста, подробнее рассказать о своей проблеме?
Ответ №1:
Проще всего было бы сохранить результат ‘narrow’ в java.lang.Объект, а затем посмотрите, какого он типа…
Комментарии:
1. Хм, я попробовал это, и я все еще получаю исключение приведения!? Кстати, PublicRepository расширяет тип EJBObject.
2. Я весьма удивлен, что вы получаете ClassCastException при попытке присвоить результат метода «Объекту»…
3. Вы должны передать Object.class для сужения(), вместо PublicRepository.class. Фактическое исключение ClassCastException генерируется в основном внутри narrow(), а не при возврате метода. Но сначала, почему бы вам просто не распечатать home.getClass()?
Ответ №2:
Ошибка означает, что вы искали контекст, а не связанный объект. Другими словами, вы искали «cea» вместо чего-то вроде «cea / Bean». Это аналогично использованию FileInputStream в каталоге.
Ответ №3:
Я использовал неправильное имя JNDI, следовательно, он не смог извлечь объект. Спасибо всем за просмотр.