要するに。 古典的なオプションを検討してください-アプリケーションにはビジネスロジックがあり、どういうわけか
外の世界と対話します。 このような束を使用します。
クライアント<->トランスポート<->レシーバー<->シリアライザー/デシリアライザー<->ビジネスロジックメソッド。
シリアライザーは、JSONでのシリアル化やXMLでのシリアル化など、交換可能なモジュールによって提案されます。
後でビジネスロジックを忘れて、レシーバーとシリアライザーの束に集中できます。
サーブレットをレシーバーとして使用し、シリアライザーのために、簡単にするために、次のインターフェースの実装を使用します。
interface ISerializer {
String selialize(Object obj);
}
コンポーネントをバインドするには、SpringFrameworkを使用します。 記事の冒頭のリンクに再度戻ります。インターフェースの注入は注釈に基づいており、サーブレットは次のように記述されています。
@Component
public class TestServlet extends HttpServlet {
@Autowired
private ISerializer serializer;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
// ...
// Object result;
res.setContentType("text/plain");
PrintWriter out = res.getWriter();
out.println(serializer.serialize(obj));
}
}
これは、シリアライズを使用するための不自然で最適な例ではないことを予約しますが、
シリアライザーをサーブレットにバインドすることはもっともらしいです。
gemini-blueprintとspringモジュールがインストールされたApache Felixサーバーですべてが始まりました。
[INFO] Started jetty 6.1.x at port(s) HTTP:8080
____________________________
Welcome to Apache Felix Gogo
g! lb
START LEVEL 1
ID|State |Level|Name
0|Active | 0|System Bundle (4.0.1)
1|Active | 1|AOP Alliance API (1.0.0)
2|Active | 1|Apache Log4J (1.2.16)
3|Active | 1|SLF4J API (1.6.1)
4|Resolved | 1|SLF4J Log4J Binding (1.6.1)
5|Active | 1|SLF4J Jakarta Commons Logging Over SLF4J Binding (1.6.1)
6|Active | 1|gemini-blueprint-core (1.0.0.RELEASE)
7|Active | 1|gemini-blueprint-extender (1.0.0.RELEASE)
8|Active | 1|gemini-blueprint-io (1.0.0.RELEASE)
9|Active | 1|Apache Felix Bundle Repository (1.6.6)
10|Active | 1|Apache Felix Gogo Command (0.12.0)
11|Active | 1|Apache Felix Gogo Runtime (0.10.0)
12|Active | 1|Apache Felix Gogo Shell (0.10.0)
13|Active | 1|Apache Felix Http Jetty (2.2.0)
14|Active | 1|Apache Felix Http Whiteboard (2.2.0)
15|Active | 1|Spring AOP (3.1.0.RC1)
16|Active | 1|Spring ASM (3.1.0.RC1)
17|Active | 1|Spring Aspects (3.1.0.RC1)
18|Active | 1|Spring Beans (3.1.0.RC1)
19|Active | 1|Spring Context (3.1.0.RC1)
20|Active | 1|Spring Context Support (3.1.0.RC1)
21|Active | 1|Spring Core (3.1.0.RC1)
22|Active | 1|Spring Expression Language (3.1.0.RC1)
叙情的な余談。 Felix 4.0.1に同梱されているJetty Webサーバーはバージョン6.1です。つまり、@ WebServletサーブレットのアノテーションでjava-ee-6を忘れることができます。 Jetty 8を個別に組み立てたいという希望はありませんでしたが、その場で打ち上げることはできませんでした。
そのため、驚いたことに、パッケージをアセンブルしてインストールした後、Jettyから404エラーを受け取り、マッピングがないためにすべてをダンプしました。
グーグルは助けて、アクティベータクラスはサーブレットを開始するために書かれました:
public class Activator implements BundleActivator {
private ServiceRegistration reg;
@Override
public void start(BundleContext context) throws Exception {
Dictionary<String, String> props = new Hashtable<>();
props.put("alias", "/");
this.reg = context.registerService(Servlet.class.getName(), new TestServlet(), props);
}
@Override
public void stop(BundleContext context) throws Exception {
this.reg.unregister();
}
}
プロジェクトが再構築され、起動されます。
作業は完了し、サーブレットが起動して応答しますが、selializator変数は残念ながらnullを示しています。
サーブレットの@Componentアノテーションにも効果があることに注意してください。 今後、2つのサーブレットインスタンスが実際に作成されたと言います。 1つは注釈によって作成され、シリアライザーに接続することさえありました。2つ目はアクティベーターで正直に作成され、@ Autowired注釈は機能しませんでした。 アクティベーターからISerializerを実装するサービスの検索は失敗しました。 アクティベーターの呼び出しは、必要なサービスがシステムに登録される前に行われました。
最終的に問題を解決することができた次のグーグルの先。
クラスが@Componentアノテーションで記述されている場合、@ PostConstructアノテーションをクラスメソッドの1つに追加できます(メソッドには制限があります。アノテーションのドキュメントを参照してください)。 要するに、このメソッドはすべての依存性注入の後に呼び出されます。
そこで、Jettyにサーブレットを登録するメソッドを追加します。
@PostConstruct
public void postConstruct() {
BundleContext context = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
Dictionary props = new Properties();
props.put("alias", "/");
context.registerService(Servlet.class.getName(), this, props);
}
servlet-OSGiバンドルチュートリアルでは、サーブレットを自分で登録すると、
ただし、モジュールをアンロードして自分で再登録する場合は必要です。
//
ServiceRegistration reg = context.registerService(Servlet.class.getName(), this, props);
//
reg.unregister();
私の場合、登録解除の呼び出し(destroy()メソッドからサーブレットを呼び出そうとしました)は、
サービスがそのステータスではなくなったことを示すエラー、つまり 既に登録解除されています。 どうやら
@Componentアノテーションがこれを処理します。 これで私は落ち着いた。
アクティベータークラスは必要なくなりました。 結果は、注入可能なサーブレットです
必要な実装。 面倒な設定XMLファイルなしでこれらすべてを実行できます。
この記事が誰かを助け、ネット上の情報の長い検索からあなたを救うことを願っています。
追加のソース
例付きのアーカイブ