我有一個Java EE 6中的大型Web項目,到目前爲止一切都很好。將EJB與常規的Java類一起使用。試圖實例化一個無狀態的EJB
現在我添加一個接收twitter信息並返回一個字符串的新類。到目前爲止,字符串已經從twitter的JSON文件中提取出來,並準備好保存在我的數據庫中。我的問題是我不知道如何從通常處理我所有數據庫調用的EJB傳遞信息。我正在使用JPA並擁有一個DAO類,管理員可以訪問所有數據庫。我已經有一個方法updateDatabase(String)
。我希望能夠從具有要添加的字符串的類中調用updateDatabase(String)
,但我不知道是否可以像這樣實例化無狀態bean。通常情況下,你注入bean,然後調用他們的類名來訪問他們的方法。我也可以試着從EJB內部引用生成類的twitter字符串,但是我必須在那裏實例化它,並混淆main()方法調用來執行。我不確定如何做到這一點。現在我的Twitter消費類只是一個主要方法的POJO。出於某種原因,某些庫方法在面向IOUtils()API的主體之外不起作用,直接說「實例不應該在標準編程中構建」。
因此,在更高層次的底線上,我只是問POJO如何通常「混合」到Java EE項目中,其中大多數類都是EJB和servlet。
編輯:上面在重讀後讓我感到困惑,所以我會盡量簡化它。基本上我有一個主要方法的類。我想調用處理數據庫訪問的EJB類,並將其稱爲updateDatabase(String)
方法,並傳入字符串。我應該怎麼做?
編輯:所以它看起來像一個JNDI查找和子序列引用是這樣做的首選方式,而不是直接實例化EJB?
編輯:這些類都在同一個web項目。在同一個包中。我可以注入一個或將POJO轉換爲EJB。然而,POJO確實有一個主要的方法,並且一些庫文件不喜歡被實例化,所以在main中運行它似乎是最好的選擇。
我的主要代碼:
public class Driver {
@EJB
static RSSbean rssbean;
public static void main(String[] args) throws Exception {
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("", ""));
}
///////////////end auth code/////////////////////////////////end
URL twitterSource = new URL("http://search.twitter.com/search.json?q=google");
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.substring(urlContents.indexOf('s')));
JSONObject jsonObject = resultsArray.getJSONObject(0);
String twitterText = jsonObject.getString("text");
rssbean.updateDatabase("twitterText");
}
}
我也得到一個java.lang.NullPointerException
地方約rssbean.updateDatabase("twitterText");
你不要創建一個EJB實例。永遠。這是Conainer處理的事情。另一方面,你可以做的是在一個方法上放一個PostConstruct註解並在那裏執行某些操作(而不是構造函數),但這與你的問題無關 –
好吧,EJB爲空的原因可能是因爲驅動程序類不是容器管理類。這應該只在Driver類是應用程序入口點類時纔有效(這是您可以在靜態字段中注入EJB的唯一方法)。但是,你說這是一個Web應用程序。那麼你從哪裏調用Driver.main()?無論如何,如果你確實需要在靜態方法中使用該代碼(假設它不是入口點),那麼我會看到JNDI查找或者在工廠模式中重構代碼,以便沿着這些行注入實例或其他東西。 –
我只是使用主要方法來測試操作。我不一定需要它爲Web應用程序。雖然我不確定使用什麼機制來觸發從URL獲取數據然後添加到數據庫的操作。我需要某種自動執行。 – Randnum