IllegalLoopbackException: невозможно вызвать метод для одноэлементного компонента сеанса при создании экземпляра компонента.

Я получаю следующее исключение:

Exception data: javax.ejb.IllegalLoopbackException: Cannot call a method on a singleton session bean while constructing the bean instance : MyWar.war#BarProducer

Мой код выглядит следующим образом.

У меня есть сессионный компонент без сохранения состояния, который внедряет как Foo, так и Bar.

@Stateless
public class MySessBean {

    @Inject
    private Foo foo;

    @Inject
    private Bar bar;

    public SomeData myMethod1(...){
        //does something with Foo
        foo.xyz();
    }

    public SomeData myMethod2(...){
        //does something with Bar
        bar.xyz();
    }   

}

У меня есть продюсер, который создает Singleton Foo:

@Singleton
public class FooProducer {

    @Produces
    public Foo getFoo() {
         return new Foo();
    }
}

У меня есть еще один продюсер, который создает Singleton Bar. Чтобы создать Bar, мне нужно ввести Foo:

@Singleton
public class BarProducer {

    @Inject
    private Foo foo;

    @Produces
    public Bar getBar() {
            //uses Foo
        foo.xyz();
    }
}

Я использую WebSphere 8 (OpenWebBeans). Я полагал, что контейнер будет знать, что ему нужно создать синглтон Foo, прежде чем он создаст синглтон Bar ??


person DarVar    schedule 24.10.2013    source источник


Ответы (1)


вы на самом деле не используете CDI здесь. Это проблема EJB. Проблема в том, что вы не указываете @DependsOn для своих EJB. См. здесь: http://docs.oracle.com/javaee/6/api/javax/ejb/DependsOn.html

person John Ament    schedule 24.10.2013
comment
Вау, еще одна концепция JEE6, о которой я не знал. Не могли бы вы добавить фрагмент, показывающий, как @DependsOn будет использоваться в данном примере? - person Jan Galinski; 25.10.2013
comment
В BarProducer добавьте @DependsOn("FooProducer") на уровне класса. - person John Ament; 25.10.2013
comment
Спасибо... одно исправление: поскольку компоненты не @Named, я полагаю, вы имеете в виду fooProducer, верно? - person Jan Galinski; 25.10.2013
comment
Значением является имя вашего компонента в соответствии с соглашениями об именах EJB. - person John Ament; 25.10.2013
comment
Я предполагаю, что javax.ejb.DependsOn можно использовать только с javax.ejb.Singleton? Является ли их аннотация CDI DependsOn для javax.inject.Singleton? - person DarVar; 25.10.2013
comment
О, я только что заметил, что javax.inject.Singleton не является CDI. Поэтому я предполагаю, что вопрос должен быть таким: существует ли аннотация DependsOn CDI для javax.enterprise.context.ApplicationScoped? - person DarVar; 25.10.2013
comment
Нет, эквивалента нет. Но если это так (например, вы не включили импорт в свой пример), ошибка веб-сферы очень странная. Ошибка явно указывает на то, что ваш BarProducer является javax.ejb.Singleton singleton session bean while constructing the bean instance : MyWar.war#BarProducer - person John Ament; 26.10.2013
comment
Предлагаем вам добавить подробные примеры и пояснения из этих комментариев в сам ответ. - person dbreaux; 08.11.2013