java - @Resource 没有在 jboss 7 中注入(inject) SessionContext

标签 java jboss ejb resteasy

我将单例 EJB 公开为 Restful 服务;要求是通过 Rest API 启动计时器。因为这将是 Web 应用程序,所以我将 ejb 类打包到 war 文件中。我能够成功部署 bean 并调用 Web 服务,但无法启动计时器,因为 @Resource 注释没有在上述单例 ejb 中注入(inject) SessionContext(也尝试使用无状态 session bean)。调试时,我看到 SessionContext 对象为空。关于如何在这种情况下使计时器服务工作的任何建议?以下是详细信息:

  • JBoss 7.1.1 最终版本
  • RestEasy 2.3.7 最终版本
  • Java 7

TimerSessionBean.java:

import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Singleton;
import javax.ejb.Timer;
import javax.ejb.Timeout;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Singleton
@Path("/config")
public class TimerSessionBean {

   @Resource
   private SessionContext context;

   @GET
   @Path("{id}")
   public void createTimer(@PathParam("id") long duration) {
       context.getTimerService().createTimer(duration, "Hello World!");
   }

   @Timeout
   public void timeOutHandler(Timer timer) {
       System.out.println("timeoutHandler : " + timer.getInfo());       
   }
}

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <listener>
        <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
    </listener>
    <filter>
      <filter-name>ShiroFilter</filter-name>
      <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
    </filter>
    <filter-mapping>
       <filter-name>ShiroFilter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
 </web-app>

AppConfig.java:

import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/")
public class AppConfig extends Application {

    @Override
    @SuppressWarnings("unchecked")
    public Set<Class<?>> getClasses() {
         Set<Class<?>> set = new HashSet<Class<?>>();
         set.add(TimerSessionBean.class);
         return set;
    }
}

服务器日志摘录:

20:09:08,850 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named TimerSessionBean in deployment unit deployment "myapp-1.0.war" are as follows:
    java:global/myapp-1.0/TimerSessionBean!app.ws.resources.TimerSessionBean
java:app/myapp-1.0/TimerSessionBean!app.ws.resources.TimerSessionBean
java:module/TimerSessionBean!app.ws.resources.TimerSessionBean
java:global/myapp-1.0/TimerSessionBean
java:app/myapp-1.0/TimerSessionBean
java:module/TimerSessionBean

最佳答案

您正在将 ejb 打包到一个 war 文件中,这意味着您正在使用 EJB 3.1 Lite那是一个reduced set ejb 特性。 我不确定为什么没有注入(inject) SessionContext 实例, 但请记住,TimerService 在此简化版本的 ejb 规范中不可用。

关于java - @Resource 没有在 jboss 7 中注入(inject) SessionContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21352126/

相关文章:

java - 递归法

java - JBoss Fuse - 获取体型

linux - Jboss 作为 Linux 中的服务

java - 在 JBoss 上部署问题

jakarta-ee - 使用 EJB 进行 Bean 验证

mysql - (JPA) 无法使用 hibernate.hbm2ddl.auto 正确实现多对一关系

java - 避免运行生成超长命令行的 java 测试时出现错误?

java - 在 JTextArea 或 JTextPane 中设置文本样式

java eclipse 修补了 JRE 类 Xbootclasspath 无法找到或加载主类

java - 有没有办法在遇到异常时强制事务回滚?