Restful Web サービスである非常に単純なクラスがあります。Web サービスで EJB を使用したい。@EJB アノテーションを使用して EJB を注入しました。唯一の問題は、EJB が常に null だったことです。次に、Web サービス自体をステートレス EJB にしました。これにより、ヌルの問題が修正されました。ただし、EJB で関数を呼び出そうとすると、次のエラーが発生します。
EVERE: EJB5070: ステートレス セッション Bean の作成中に例外が発生しました: [CasperLoggingDao] 警告: EJB5184: EJB CasperLoggingDao、メソッドの呼び出し中にシステム例外が発生しました: public boolean com.dv.model.dao.CasperLoggingDao.log(com.dv.model.entity.CasperLogMessage) 警告: javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: ステートレス EJB を作成できませんでした com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:454) で com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2547) で com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1899) で com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) で com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) で $Proxy319.log で (不明なソース) com.dv.model.dao.__EJB31_Generated__CasperLoggingDao__Intf____Bean__.log (不明なソース) で com.dv.ws.casper.logging.CasperLoggingResource.putXml (CasperLoggingResource.java:64) で sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) で java.lang.reflect.Method.invoke(Method.java:601) で org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) で org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) で com.sun.ejb.containers.BaseContainer.invokeBeanMethod (BaseContainer.java:5388) で com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619) で com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800) で com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571) org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:42) で sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) で java.lang.reflect.Method.invoke(Method.java:601) で com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(Int) で ...
これは私のクラスです。log() を呼び出しているだけであることに注意してください。
@Stateless
@Path("casper/logging")
public class CasperLoggingResource {
private static final Logger logger = Logger.getLogger(CasperLoggingResource.class.getName());
@Context
private UriInfo context;
@EJB
private CasperLoggingDao casperLogger;
/**
* Creates a new instance of GenericResource
*/
public CasperLoggingResource() {
}
/**
* PUT method for updating or creating an instance of GenericResource
* @param content representation for the resource
* @return an HTTP response with content of the updated or created resource.
*/
@PUT
@Consumes("application/xml")
public void putXml(String content) {
try
{
CasperLogMessage message = CasperLogMessageConverter.convertXMLToEntity(content);
casperLogger.log(message);
}
catch(Exception e)
{
logger.log(Level.SEVERE, "Could not execute", e);
}
}
}
以前はこれが機能していました。Restful Web サービスから EJB にアクセスするには、何か特別なことをする必要がありますか? 他のアイデアはありますか?
編集: CasperLoggingDao のコードは次のとおりです。
@Stateless
@LocalBean
public class CasperLoggingDao extends BaseDao<CasperLogMessage> {
private static final Logger logger = Logger.getLogger(CasperLoggingDao.class.getName());
public CasperLoggingDao()
{
super(CasperLogMessage.class);
}
public CasperLoggingDao(EntityManager em)
{
super(CasperLogMessage.class, em);
}
public boolean log(CasperLogMessage casperLogMessage)
{
return create(casperLogMessage) != null;
}
}