2011-12-12 59 views
0

我已經在這裏問了一個類似的問題:Best way to interact with EJBs in Java EE而且響應非常好,但是我仍然沒有得到我期待的結果。儘管我添加了@PostConstruct註釋並將主類轉換爲託管bean,但仍然沒有調用EJB,因此我可以使用注入。我認爲我很接近,但我仍然沒有掌握一些涉及Java EE和EJB的基本概念。我想我可能不得不使用某種計時器事件來完成這項工作。EJB永遠不會被調用,不會執行

同樣,我的問題是,我希望這個類在運行時至少執行一次。它從URL獲取推送結果,將內容解析爲數組,然後將第一個值添加到數據庫。數據庫管理通過另一個EJB來完成,所以我必須使用某種注入來訪問這個類。最初我創建了一個測試代碼的主要方法,但是我得到了空引用異常,因爲我試圖從一個普通的java類中注入並調用EJB的方法。

這是我的新代碼與託管豆類和PostConstruct註釋:

@ManagedBean 

public class Driver { 

@EJB RSSbean rssbean; 

@PostConstruct 
public void initURL() throws IOException, JSONException{ 

    System.setProperty("http.proxyHost", "proxya..com"); 
    System.setProperty("http.proxyPort", "8080"); 
    /////////////auth code///////////////auth code///////////////// 
     String username = System.getProperty("proxy.authentication.username"); 
     String password = System.getProperty("proxy.authentication.password"); 
     if (username == null) 
     { 
      Authenticator.setDefault(new ProxyAuthenticator("s", "w")); 
     } 
    ///////////////end auth code/////////////////////////////////end 

    URL twitterSource = new URL("http://search.twitter.com/search.json?q=news"); 
    ByteArrayOutputStream urlOutputStream = new ByteArrayOutputStream(); 

       IOUtils.copy(twitterSource.openStream(), urlOutputStream); 
       String urlContents = urlOutputStream.toString(); 
       JSONObject thisobject = new JSONObject(urlContents); 
       JSONArray names = thisobject.names(); 
       JSONArray asArray = thisobject.toJSONArray(names); 
       JSONArray resultsArray = thisobject.getJSONArray("results"); 

       JSONObject(urlContents.trim()); 

      JSONObject jsonObject = resultsArray.getJSONObject(0); 

      String twitterText = jsonObject.getString("text"); 

      System.out.println("Calling rssbean from Driver"); 
      **rssbean.updateDatabase("twitterText");** 
       }} 

與rssbean.updateDatabase的底線是什麼需要執行的更新得到持久化到數據庫。

+0

我不確定'@ Startup'與'@ ManagedBean'結合使用。 – Thomas

+0

我會從問題中刪除它,以免分散人們的注意力。我已經嘗試過,沒有特定的註釋,但沒有影響結果。 – Randnum

+0

你以某種方式檢索bean嗎?如果不是那可能是問題。 '@ Startup'會導致bean在開始時自動初始化,但似乎只適用於'@ Singleton' bean。 – Thomas

回答

2

您必須添加@Stateless@Stateful(根據您的使用/需要),然後刪除@ManagedBean。如果你使它@Stateful一定要實現Serializeable接口。

+0

我做了這個改變,但我認爲問題是沒有什麼是真的調用這個Driver類。它沒有綁定到用戶事件,因此沒有要求它執行。我認爲@postconstruct可能以某種方式在後臺運行,但我認爲我真正需要的是某種類型的計時器類,或者以某種方式將它與第一個加載servlet的頁面綁定。 – Randnum

+0

@PostConstruct只是在創建對象之後調用的一個方法(並且注入了所有依賴資源)。這只是一個回調。我認爲你得到了錯誤的目的:=) – LuckyLuke

+0

也許:/我想我也期待它運行,只要我在服務器上運行項目,即使我只是運行index.xhtml頁面。我認爲Glassfish可能會忽略這些EJB,直到他們需要。因爲它肯定被忽略。 – Randnum

相關問題