Получение Entitismanager / EJB внутри A @ Facesconverter / Валидатор приложения для упаковки войны
-
17-09-2020 - |
Вопрос
У меня есть приложение Javaee6, работающее на GlassFish V3.0.1 с EJB 3.1 (приложение упаковано в качестве войны), и все мои EJBS являются @Localbeans. В настоящее время я пишу Facesconverter для использования в JSF2, в котором мне нужен EntityManager, чтобы вернуть сущность из идентификатора.
Теперь мне интересно, что является лучшим образом и самый чистый способ получить фонд, чтобы заставить EntityManager внутри Facesconverter, теперь, когда мы находимся на Jee6?Или я могу даже получить доступ к EJB через язык выражения?И сварки / CDI не работают внутри FACESCONVER, или он делает это?
@FacesConverter(value="subscriptionListConverter")
class SubscriptionListConverter extends Converter {
public Object getAsObject(FacesContext ctx, UIComponent comp, String value) {
var id:Long = Long.parseLong(value);
// How to get the entitymanager?
return em.find(User.getClass, id);
}
public String getAsString(ctx:FacesContext, comp:UIComponent, value:Object) {...}
}
.
Извините, я надеюсь, что это не дублируют, но большинство случаев я видел, где немного по-другому и не помог мне много.
Решение 2
ОК, после того, как некоторые пытаются вокруг, я успешно получил EJB с ручным поиском:
Context ctx = new InitialContext();
UserEJB userEJB = (UserEJB) ctx.lookup("java:global/teachernews/" + UserEJB.class.getName())
.
Выглядит хорошо, но в любом случае, если есть некоторые другие интересные подходы, не стесняйтесь публиковать их.
Другие советы
Я также использую ручной поиск, но я создал интерфейс конвертера Abstruction Class Atrimation, чтобы простираться на разные преобразователи и иметь метод, чтобы получить EJBS.Чтобы повторно использовать его в разных приложениях, я проделал следующее, чтобы получить имя appname и веб-модуля:
abstract public class Converter implements javax.faces.convert.Converter
{
public Object getManager(String jndiName) throws NamingException
{
ServletContext servletContext = (ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext();
Context env = new InitialContext();
String aname = (String)env.lookup("java:app/AppName");
if (aname == null || aname.length() == 0 || servletContext.getContextPath().equals(aname)) //FIXME If deploying war inside an ear, appname equals module name, won't work.
return env.lookup("java:global/" + aname + "/" + jndiName);
else
return env.lookup("java:global/" + aname + servletContext.getContextPath() + "/" + jndiName);
}
}
. Я только что использовал @ejb, чтобы ввести их в моих преобразователей.