java.lang.ClassCastException: $ Proxy99 не может быть приведен - PullRequest
1 голос
/ 05 апреля 2010

Я использую JBoss4.2.2 и java6.

Имя развернутого уха - apa.ear

В сервлете у меня есть следующая строка кода:

placeBid = (PlaceBid) context.lookup("apa/"
  + PlaceBid.class.getSimpleName() + "/remote");

У меня есть сгенерированный jboss-app.xml, подобный этому:

<jboss-app>
  <loader-repository>apa:app=ejb3</loader-repository>
</jboss-app>

При попытке получить PlaceBid через контекст я получаю это исключение

java.lang.ClassCastException: $Proxy99 cannot be cast to se.nextit.actionbazaar.buslogic.PlaceBid

Интерфейс PlaceBid выглядит следующим образом:

@Remote
public interface PlaceBid {
 Long addBid(String userId, Long itemId, Double bidPrice);
}

Когда я запускаю пример с EJB3 в действии, он работает. Пример кода EJB3 в действии содержит сборку муравья. Я хочу использовать Maven, поэтому я немного изменил код.

Однако я не понимаю, что я делаю здесь неправильно. У меня есть некоторые мысли о файле jboss-app.xml. Я не уверен, как должно выглядеть его содержимое.

Благодарен за любую помощь.

С наилучшими пожеланиями, Лассе

Ответы [ 2 ]

1 голос
/ 06 апреля 2010

В качестве первого шага попробуйте следующее:

Object obj = context.lookup("apa/" + PlaceBid.class.getSimpleName() + "/remote");
System.out.println("Object = " + obj.getClass().getName());
System.out.println("Interfaces = " + Arrays.toString(obj.getClass().getInterfaces()));

Он расскажет вам, что такое настоящий класс-заглушка и какие интерфейсы он реализует. Это может дать вам достаточно подсказки, чтобы понять, что происходит не так.

Также предположительно ваш боб определяется как:

@Stateless
public class MyPlaceBidBean implements PlaceBid {
    ...
}

т.е. он реализует интерфейс PlaceBid?

0 голосов
/ 23 апреля 2010

Если контекст имеет тип javax.naming.Context (или InitialContext), то проблема в том, что у вас отсутствует вызов PortableRemoteObject.narrow:

placeBid = (PlaceBid) PortableRemoteObject.narrow(context.lookup("apa/"
  + PlaceBid.class.getSimpleName() + "/remote", PlaceBid.class);

Это требуется спецификацией EJB для удаленных интерфейсов. Если вместо этого вы используете ссылку (@EJB или ejb-ref), контейнер будет обрабатывать узкие для вас.

...