2013-03-26 172 views
3

汽車無運行進樣BeanClass到了ServletContextListener這就是我有一個是在開始了我的JBOSS 7.1服務器運行的ServletContextListener。這基本上監聽一個文件夾,並等待新文件,並等待新的Excel文件,並重新命名它們。在JBOSS 7.1

的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內導入進來新的Excel文件loadDatabase()方法。我試圖注入將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全班分成了ServletContextListener

錯誤

1時,即時通訊現在得到一個錯誤:15:06447 ERROR [org.apache.catalina.core.ContainerBase。[jboss.web]。[default-host]。[/ mast]](MSC服務線程1-1)Error configuri類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] 在1 org.jboss.as.web.deployment.component.WebComponentInstantiator $(WebComponentInstantiator.java:57)的JBoss-AS-web的7.1.1.Final.jar :7.1.1.Final]

顯然即時在這裏做得不對......只是不知道是什麼,任何幫助,非常感謝!

乾杯

+3

EntityManager通常不適用於CDI注入'@ Inject'。你有合適的製片人嗎? Wthout它的參考將'空' – kostja 2013-03-26 10:12:51

+0

+1 kostja,你不能簡單@注入一個實體經理。您需要通過PU訪問它(通常這是在生產者方法上完成的)。爲什麼不給已經設置好的類注入servlet監聽器? – Perception 2013-03-26 10:19:31

+1

剛剛在那裏更新 - 歡呼@Perception會嘗試 – user1694873 2013-03-26 10:21:37

回答

2

嘗試使用@EJB註解注入你的DAO到聽衆:

@EJB ImportDatabase importDatabase; 

此外,你並不需要注射兩TableDAOImportDatabase,選擇一個或其他。最後,您當前的生產者是請求作用域,這將阻止它在servlet偵聽器的上下文中解析(當偵聽器被初始化時,請求作用域將不會被激活)。我會建議刪除它的範圍。

+0

乾杯現在會嘗試(Id給你一個+1,但我限制在這一刻與我的0評級:()謝謝 – user1694873 2013-03-26 11:23:51

+0

只是試圖使用EJB符號,但仍然得到上述相同的錯誤 – user1694873 2013-03-26 11:28:29

+0

非常感謝很多spiritwalker - 這是我的問題的解決方案的一部分 - 看到我上面的評論我應該如何標記我的答案,你自己和@Perception ?? – user1694873 2013-03-26 11:47:22