EJB3.0 Сериализация дескриптора для компонента с состоянием - PullRequest
1 голос
/ 02 июля 2011

Я пытаюсь сохранить удаленный дескриптор в компоненте Stateful EJB3.0.Интерфейс этого bean-компонента определен:

@Remote
public interface Hello extends Serializable {
     Handle getHandle();
     void sayHello();
}

Реализация:

@Stateful
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class HelloBean implements Hello {

    @Resource
    private SessionContext ctx;

    @Override
    public Handle getHandle() {
          try {
              return ctx.getEJBObject().getHandle();
          } catch (Exception e) {
              throw new RuntimeException(e);
          }
    }

    @Override
    public Handle sayHello() {
        System.out.println("hello");
    }
}

В соответствии со спецификацией EJB, это должно схватить меня за сериализуемый дескриптор.Но вместо этого я получаю:

Caused by: java.lang.IllegalStateException: EJBObject not available
    at com.sun.ejb.containers.EJBContextImpl.getEJBObject(EJBContextImpl.java:328)
    at com.zzz.zzz.HelloBean.getHandle(WorkHolderBean.java:125)
    ... 75 more

Я не уверен, что понимаю, что я сделал неправильно ... Все бины Stateful должны иметь сериализуемую ручку.Есть ли «правильный» способ получения сериализуемого дескриптора в EJB3.0?

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

getEJBObject не может использоваться с моделью программирования EJB 3.0.Вам нужно будет использовать @RemoteHome и реализовать EJBHome / EJBObject.

0 голосов
/ 02 июля 2011

Это исключение не связано с проблемой сериализации.Из J2EE API Reference вы можете прочитать:

IllegalStateException - Брошенный, если экземпляр вызывает этот метод, когда экземпляр находится в состоянии, которое не позволяет экземпляру вызывать этот метод, или если экземпляр не делаетиметь удаленный интерфейс.

и более:

Экземпляр корпоративного компонента сеанса может вызывать этот метод в любое время между PostConstruct или ejbCreate и методами PreDestroy или ejbRemoveвключая эти методы.

Возможно, вы вызываете метод getHandle на этапе, когда вы не можете использовать getEjbMethod.Возможно, что-то идет не так с вашей инициализацией Session (я полагаю, что атрибут ctx инициализирован где-то в коде, который вы пропустили для простоты)

...