混合HessianServlet給出一個吉斯的servlet模塊configureServlets()
下面的代碼:注射用Guice的許多裝飾實例 - 與吉斯
serve("/a").with(new Decorator(new A()));
serve("/b").with(new Decorator(new B()));
...
serve("/z").with(new Decorator(new Z()));
...
什麼是正確注入這一切的最佳/最簡單的解決方案? (即在各種裝飾類A,B,C中注入字段...)
我在考慮使用命名提供程序,但我寧願不必爲每個A,B,C定義新的提供程序類。理想的解決方案將是通用的。
混合時黑森州通過Guice ...
爲了幫助準確的問題,真正的代碼使用的網絡服務與黑森州。在網上挖掘後,目前有沒有在這個問題上的正確答案(我見過很多醜陋的黑客),並且由給出的解決方案Guillaume符合這個精確的案例。
總結原始問題:使用Hessian實現Web服務,必須實現HessianServlet
,這是一個GenericServlet
;但是Guice只能綁定HttpServlet
。訣竅是這樣實現的一個瘦包裝HessianHttpServlet
:
class HessianHttpServlet extends HttpServlet {
public HessianHttpServlet(HessianServlet hessianServlet) {
this.hessianServlet = hessianServlet;
}
@Override public void init(ServletConfig config) throws ServletException {
hessianServlet.init(config);
}
@Override public void service(ServletRequest request, ServletResponse response) {
hessianServlet.service(request, response);
}
}
,並呼籲:
serve("/a").with(new HessianHttpServlet(new WebServiceA()));
完整的解決方案因此,在這種情況下,注入WebService
X:
void configureServlet() {
serve("/a").with(new HessianHttpServlet(inject(new WebServiceA())));
serve("/b").with(new HessianHttpServlet(inject(new WebServiceB())));
...
serve("/z").with(new HessianHttpServlet(inject(new WebServiceZ())));
}
private HessianServlet inject(HessianServlet hessianServlet) {
requestInjection(hessianServlet);
return hessianServlet;
}
原諒我的無知,但這個裝飾者的東西是什麼?你不能只用(A.class)綁定serve(「/ a」)嗎? A上的注射將自動完成。 B,C,Z也一樣。我覺得我錯過了一些東西。 – 2012-02-13 12:21:03
那麼,裝飾器是在這裏添加所有裝飾類A,B,C之上的通用功能......直接將此功能添加到A,B,C將打破擁有此裝飾器的優勢。此外,裝飾器可以動態改變;在這裏我只用一個裝飾器做了一個簡單的例子。 – 2012-02-13 13:55:50