私はJava EE 6に大きなWebプロジェクトを持っています。通常のJavaクラスでのEJBの使用。ステートレスなEJBをインスタンス化しようとしています
ここでは、Twitter情報を取得して文字列を返す新しいクラスを追加します。これまでのところ、文字列はTwitterからJSONファイルから抽出され、私のデータベースに永続化される準備が整いました。私の問題は、通常、すべてのデータベース呼び出しを処理するEJBから情報を渡す方法がわかりません。私はJPAを使用しており、そのマネージャはすべてのデータベースアクセスを持つDAOクラスを持っています。私はすでにupdateDatabase(String)
のためのメソッドを持っています。私は追加する文字列を持つクラスからupdateDatabase(String)
を呼び出すことができるようにしたいと思いますが、そのようなステートレスBeanをインスタンス化するための良いフォームかどうかわかりません。通常は、Beanを挿入し、そのメソッドにアクセスするためにクラス名だけを呼び出します。私は、おそらく、EJBの内部からクラスを生成するtwitter文字列を参照してみることもできますが、そこでインスタンス化してmain()メソッド呼び出しを実行して実行する必要があります。私は本当にこれを行う方法がわかりません。今、私のTwitterの消費クラスは、mainメソッドを持つ単なるPOJOです。何らかの理由で、ライブラリメソッドのいくつかが、IOUtils()APIのメインインターフェイスの外部で動作しなかったため、「インスタンスは標準プログラミングでは構築しない」と直接言います。
私はPOJOがJava EEプロジェクトにどのように「混在しているか」を尋ねています。ほとんどの場合、クラスはEJBとサーブレットです。
編集:再読した後、上記のことがわかりにくいように見えるので、私はそれを簡素化しようとします。基本的に私はメインメソッドを持つクラスを持っています。データベースアクセスを扱うEJBクラスを呼び出して、updateDatabase(String)
というメソッドを呼び出し、文字列を渡すだけです。私はこれをどのようにするべきですか?
編集:EJBを直接インスタンス化するのではなく、JNDIルックアップとサブシーケンス参照のように見えますか?
編集:これらのクラスはすべて同じWebプロジェクト内にあります。同じパッケージ内にあります。私は1つを注入するか、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");
}
}
私もrssbean.updateDatabase("twitterText");
あなたはEJBのインスタンスを作成しません。これまでそれはコンニナーが扱うものです。一方、あなたができることは、メソッドにPostConstructアノテーションを入れて(コンストラクタの代わりに)何かを実行することですが、それはあなたの問題とは関係ありません。 –
その理由は、そのEJBがnullである理由はおそらくドライバクラスはコンテナ管理クラスではありません。これは、Driverクラスがアプリケーション・エントリー・ポイント・クラス(静的フィールドにEJBを挿入できる唯一の方法)である場合にのみ有効です。しかし、あなたはこれがWebアプリケーションだと言っています。では、どこからDriver.main()を呼び出しますか?とにかく、静的メソッド(エントリポイントでないと仮定して)にそのコードを本当に必要とする場合、JNDIルックアップか、ファクトリパターンの周りのコードをリファクタリングしてインスタンスまたは何かをそれらの行に挿入します。 –
私は操作をテストする方法としてmainメソッドを使用していました。私は必ずしもウェブアプリケーションのためにそれを必要としません。 URLからデータを取得してデータベースに追加する操作をトリガするためにどのようなメカニズムを使用するのかはわかりませんが。私はそのために何らかの自動実行が必要です。 – Randnum