Какой InitialContextFactory следует использовать?

Я работаю над проектом EJB 3, используя OpenEJB (TomEE++).

У меня есть сессионный компонент без сохранения состояния, имя которого указано в аннотации.

@Stateless(mappedName="SlideService", name="SlideService")
public class SlideService {

    public Map<Category, List<SlideShow>> fetchSlideShowsByCategory() {
        Application app = Application.getInstance();
        return app.retreiveAllSlideShowsByCategory();
    }

    public SlideShow fetchSlideShow(long id) {
        return null;
    }

    public List<SlideShow> fetchSlideShowsByTitle(String title) {
        return null;
    }

}

Я просматриваю компонент Session из своего класса действий Struts, как здесь.

Properties properties = new Properties();
properties.setProperty Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.LocalInitialContextFactory");
InitialContext initialContext = new InitialContext(properties);
SlideService slideService = (SlideService)initialContext.lookup("SlideServiceLocalBean");

В приведенном выше коде вы заметите, что я должен использовать имя «SlideServiceLocalBean», чтобы найти компонент, тогда как я явно указал «SlideService» в аннотации компонента.

Однако, когда я пытаюсь найти bean-компонент в своем тестовом примере, мне приходится использовать еще одну строку имени.

EJBContainer ejbContainer = EJBContainer.createEJBContainer();
Object oSlideService = ejbContainer.getContext().lookup("java:global/slides/SlideService");

Почему существует несоответствие в именах поиска?

Правильно ли я получаю InitialContext в классе действий Struts или мне следует использовать другой механизм/contextFactory для получения начального контекста?

Можно ли внедрить bean-компонент в класс действий без использования внешней библиотеки DI?


person Parag    schedule 11.04.2012    source источник


Ответы (1)


Попробуйте это внутри своего класса действий struts:

new InitialContext().lookup("java:global/slides/SlideService");

Он должен работать нормально. Так что это должно быть внутри класса действий:

new InitialContext().lookup("java:module/SlideService");

Поиск с использованием LocalInitialContextFactory предшествует JavaEE 6 Global JNDI, откуда берутся эти имена java:global и java:module.

Этот документ объясняет, как это работает.

Имя вашего bean-компонента — SlideService, и он имеет то, что называется представлением @LocalBean (один bean-компонент может иметь много представлений, таких как @LocalBean, @Remote, @Local), поэтому имя для поиска SlideService как @LocalBean в конечном итоге будет SlideServiceLocalBean

Это просто формат по умолчанию. Вы можете изменить его на что угодно в файле conf/system.properties.

person David Blevins    schedule 13.04.2012
comment
Не знаю, почему, но когда я пробую первый вариант, я получаю СЕРЬЕЗНОЕ исключение: Servlet.service() для сервлета [действие] в контексте с путем [/slides] вызвало исключение [javax.naming.NameNotFoundException: Имя слайдов не привязано в этом контексте] с основной причиной javax.naming.NameNotFoundException: слайды имен не связаны в этом контексте - person Parag; 16.04.2012