我有一个非常简单的类,它是一个 Restful Web 服务。我想在 Web 服务中使用 EJB。我使用@EJB 注释来注入我的EJB。唯一的问题是,EJB 始终为空。然后,我使我的 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(Native Method) 在 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(Native Method) 在 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;
}
}