当前位置: 首页 > 知识库问答 >
问题:

不能在Restful Webservice中使用EJB

晏志明
2023-03-14

我有一个非常简单的类,它是一个Restful web服务。我想在web服务中使用EJB。我使用@EJB注释来注入我的EJB。唯一的问题是,EJB总是空的。然后我使我的web服务本身成为一个无状态EJB。这修复了空问题。但是,当我试图调用EJB上的任何函数时,我得到以下错误:

EVERE: EJB5070: Exception creating stateless session bean : [CasperLoggingDao]
WARNING: EJB5184:A system exception occurred during an invocation on EJB CasperLoggingDao, method: public boolean com.dv.model.dao.CasperLoggingDao.log(com.dv.model.entity.CasperLogMessage)
WARNING: javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
    at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:454)
    at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2547)
    at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1899)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
    at $Proxy319.log(Unknown Source)
    at com.dv.model.dao.__EJB31_Generated__CasperLoggingDao__Intf____Bean__.log(Unknown Source)
    at com.dv.ws.casper.logging.CasperLoggingResource.putXml(CasperLoggingResource.java:64)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
    at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
    at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388)
    at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
    at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
    at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
    at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:42)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(Int
...
@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);
    }
}

}

编辑:这里是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;
}


}

共有1个答案

彭俊智
2023-03-14

假设您的BaseDAO具有对EntityManager的调用,这样是否安全:

@PersistenceContext(unitName = "somePU") 
protected EntityManager entityManager;

而且,在CasperLoggingDAO上也不需要@localbean。您还需要在basedao上使用@stateless

 类似资料:
  • 问题内容: 我使用Flask-Login 在模板中提供对象。我想编写一个宏来显示评论表单或登录链接,具体取决于用户是否登录。如果我直接在模板中使用此代码,它将起作用: 我将相同的代码放在宏中,然后将宏导入模板中。 当我尝试加载此页面时,出现的错误是: 当然,简单的解决方法是current_user作为参数传递并使用该参数(进行签名comment_form(user, form)),尽管这是一个非常

  • 我试图测试一个@Controller类,其中有来自POJO的列表。我可以在另一个@RESTController类中使用@Autowired来连接控制器,但在同样的情况下,我不能将其用于测试。 user.java UserContrell3.java 在下一个类中,userresource.java我可以做@autowired 但是,在测试类UserTest.java中。我不能: 提前感谢!

  • 问题内容: 错误是 1064-您的SQL语法有误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在“ desc,发布,视图,精选”附近使用VALUES(“,”标题”,“ \ r \ n描述\ r \ n”,“ 1个 表结构是 在phpmyadmin sql编辑器中运行 问题答案: desc是mysql的保留字。您必须在保留字的列中使用反引号’‘。 您应避免将保留字用作列名或必须使用

  • imagemagick转换命令有问题。该命令与标准结构的normal.svg配合使用非常理想。 但是如果您使用 区域和 引用,它就不起作用了。 magick convert test.svg-调整50%test.png的大小 > 适用于SVG1 在带有xlink:href的SVG2上不起作用 <?xml version=“1.0”encoding=“UTF-8”?> <!doctype svg P

  • 我试图修改Vaadin发送到浏览器的引导Javascript。以下是有关此问题的瓦丁论坛链接:https://vaadin.com/forum#!/Thread/4252604 Vaadin使用Jsoup,因此我使用JSoupAPI在Vaadin负载中找到正确的位置来修改Javascript。当我像这样使用Jsoup API时: newHTML中的任何内容都会被转义。例如,如果newHTML是: