java - 将 Bean 类注入(inject) JBOSS 7.1 中连续运行的 ServletContextListener

标签 java jpa jboss ejb jboss7.x

我有一个在 JBOSS 7.1 服务器启动时运行的 ServletContextListener。这实质上是在一个文件夹上监听并等待新文件并等待当前新的 excel 文件并重命名它们。

Java

public class StagedFolderListener implements ServletContextListener {

    @Inject
    TableDao tableDao;

@Inject
ImportDatabase import;

public void contextInitialized(ServletContextEvent e) {
    System.out.println("Listener starting...");
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {

        @Override
        public void run() 
        {
            ProcessData();
        }
    }, 0, 10000);

}

public void contextDestroyed(ServletContextEvent e) {
    System.out.println("Listener destroyed...");
}

public void ProcessData() {

    String myDirectoryPath = "/home/myStoredFolder";

    File dir = new File(myDirectoryPath);
    for (File child : dir.listFiles()) {
        String extension = "";

        int j = child.getName().lastIndexOf('.');
        if (j > 0) {
            extension = child.getName().substring(j + 1);
        }


        if (fileIsOktoBeImported) {

            // Import the file into the database

                            import.loadDatabase();              


            // Rename the file after processing
        }

        else

        {
            System.out.println("No processing required on file "
                    + child.getName());
        }
    }

}

另外,我有另一个类读取 excel 文件并通过 JPA 和实体管理器将数据持久保存到数据库中。这本身就可以正常工作(我将它链接到 GUI 并且可以从那里导入)但是我需要在我的 ServletContextListener 中调用 loadDatabase() 方法来导入进来的新 excel 文件。我试图注入(inject)将 ImportDatabase 放入 ServletContextListener 并调用 loadDatabase() 方法,但是当 EntityManager 持续到数据库时我得到一个空指针异常。

Java

@Stateful
@LocalBean
public class ImportDatabase implements TableDao{
@Inject
private EntityManager em;   
Row row = null;
FileInputStream inp;
Workbook wb;

public void loadDatabase()
{

 Load data into the Database via JPA

}

更新 Java 以包含 EntityManager 生产者

Java

@Stateful
@RequestScoped
public class Resources{

    @PersistenceContext(type = PersistenceContextType.EXTENDED)
    private EntityManager em;

    @Produces
    public EntityManager getEm() {
        return em;
    }
}

在 ServetContextListener 中调用我的 loadDatabase() 方法的最佳方式是什么?

非常感谢任何帮助,

更新

我现在在将 ImportDatabase 类注入(inject) servletContextLIstener 时遇到错误

错误

1:15:06,447 错误 [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/mast]](MSC 服务线程 1-1)配置应用程序监听器时出错类 com.ericsson.listener.StagedFolderListener: java.lang.IllegalStateException: JBAS011048: 构建组件实例失败 在 org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:163) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] 在 org.jboss.as.ee.component.BasicComponent.createInstance(BasicComponent.java:85) [jboss-as-ee-7.1.1.Final.jar:7.1.1.Final] 在 org.jboss.as.web.deployment.component.WebComponentInstantiator$1.(WebComponentInstantiator.java:57) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]

显然我在这里做错了......只是不确定是什么,非常感谢任何帮助!

干杯

最佳答案

尝试使用 @EJB 注释将您的 DAO 注入(inject)监听器:

@EJB ImportDatabase importDatabase;

此外,您不需要同时注入(inject)TableDAOImportDatabase,任选其一即可。最后,您当前的生产者是请求范围的,这将防止它在 servlet 监听器的上下文中被解析(初始化监听器时请求范围不会处于 Activity 状态)。我建议删除它的作用域。

关于java - 将 Bean 类注入(inject) JBOSS 7.1 中连续运行的 ServletContextListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15634264/

相关文章:

java - 插入数据库后,第一次没有读取该值

java - JPA 对 Java 8 新日期和时间 API 的支持

google-app-engine - 通过将参数设置为查询对象的 JPA 查询返回空列表

java - 如何将smartGWT(表示层)与Spring服务集成?

http - 野蝇服务器 :Partial Content and Range Requests

java - 如何获得参加 Activity ?

java - 无法访问 Switch Case/Java 内的枚举值

java - 是否可以使用 Comparator.comparingInt 链按两个字段以相反的自然顺序对对象进行排序

java - JBoss 忽略@RemoteBinding 注解

Java 数组传递引用而不是值