Подтвердить что ты не робот

Внедрить EJB в JSF-конвертер с JEE6

У меня есть независимый EJB, который присоединяется к моей базе данных. Мне нужен этот bean в конвертере JSF 2, чтобы вернуть объект сущности из параметра параметра String. Я использую JEE6 с Glassfish V3.

@EJB аннотация не работает и получает NPE, потому что она находится в контексте лиц и не имеет доступа к контексту EJB.

Мой вопрос: Возможно ли вставить этот bean с помощью @Resource или другой аннотации или поиска JNDI, или мне нужно обходное решение?


Решение

Сделайте поиск в JNDI следующим образом:

  try {
   ic = new InitialContext();
   myejb= (MyEJB) ic
     .lookup("java:global/xxxx/MyEJB");   
  } catch (NamingException e) {
   e.printStackTrace();
  }
4b9b3361

Ответ 1

Я никогда не использовал JSF 2.0 (только 1.0), но в главе 5.4 спецификации говорится:

[...] позволяют контейнеру вводить ссылки на контейнер управляемых ресурсов в управляемый экземпляр bean, прежде чем он станет доступным для приложения JSF. Только beans объявлен в запрос, сеанса или области приложения чтобы получить доступ к ресурсам.

Но пока я понимаю, поиск JNDI должен сделать трюк.

Ответ 2

Другое (еще не очень красивое) решение может использовать привязку вместо convertId. Использование только управляемого JSF beans:

< f: конвертер binding = "# {app.personConverter}" / >

Где appBean означает что-то вроде: @ManagedBean(name="app") @ApplicationScoped class AppBean { @EJB private PersonService ps; private Converter personConverter; }

МОЖНО быть лучшим решением в CDI-стиле (JSR-299), но я не смог запустить эту программу:

< f: конверсия binding = "# {cdiBean}" / >

Где cidBean должен быть: @Named class CdiBean implements Converter { @EJB ... }

Не удалось выполнить "Поведение по умолчанию, вызванное необходимостью идентификатора преобразователя, переданного в конструкторе"

Во всяком случае, первый подход с использованием привязки и приложения с поддержкой JSF bean работает.

Ответ 4

Я не знаю, хорошо ли это решение... но оно работает:

@ManagedBean
public class AcquisitionConverter implements Converter
{
    @EJB
    private AcquisitionService service;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        ...
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value)
    {
        ...
    }
}

и

<h:inputText value="#{flowController.acquisition}" converter="#{acquisitionConverter}">

с jsf 2.1.3 (mojarra) и глазури 3.1.1