@ facesconverter / War-Packaged 앱의 유효성 검사기에서 EntityManager / EJB 가져 오기
-
17-09-2020 - |
문제
EJB 3.1 (앱은 WAR로 포장 함)에서 GlassFish V3.0.1에서 실행되는 JavaEe6 응용 프로그램이 있으며 모든 EJB는 @localbeans입니다. 현재 JSF2에서 사용하기 위해 FacesConverter를 작성하고 있습니다. 이는 EntityManager가 ID에서 엔터티를 다시 가져올 수 있습니다.
이제는 best 인 facesconverter 안에 EntityManager를 얻는 가장 깨끗한 방법이며, 이제 우리는 Jee6에 있다는 것을 궁금합니다.또는 표현식 언어를 통해 EJB에 액세스 할 수도 있습니까?WELD / CDI는 FacesConverter 내부에서 작동하지 않거나 그렇습니다.
@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
OK 주위를 시도한 후에는 수동 조회가있는 EJB를 성공적으로 얻었습니다.
Context ctx = new InitialContext();
UserEJB userEJB = (UserEJB) ctx.lookup("java:global/teachernews/" + UserEJB.class.getName())
.
는 괜찮아 보이지만 어쨌든 다른 흥미로운 접근 방식이 있으면 자유롭게 게시하십시오.
다른 팁
또한 수동 조회를 사용하고 있지만 Converter 인터페이스를 구현하는 추상 클래스를 만들고 다른 변환기로 확장하고 EJB를 가져올 방법을 갖게했습니다.다른 앱에서 재사용하려면 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를 사용하여 내 변환기에 주입했습니다.
제휴하지 않습니다 StackOverflow