Внедрить 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();
}
Ответы
Ответ 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 работает.
Ответ 3
Расширение Seam Faces для JSF 2.0 и CDI позволяет поддерживать @Inject непосредственно в Validators and Converters.
Проверьте это: http://ocpsoft.com/java/seam-faces-3-0-0-alpha2-jsf-2-0-just-got-even-easier/
Ответ 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