2012-02-13 49 views
3

混合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())); 

完整的解決方案因此,在這種情況下,注入WebServiceX

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; 
} 
+0

原諒我的無知,但這個裝飾者的東西是什麼?你不能只用(A.class)綁定serve(「/ a」)嗎? A上的注射將自動完成。 B,C,Z也一樣。我覺得我錯過了一些東西。 – 2012-02-13 12:21:03

+0

那麼,裝飾器是在這裏添加所有裝飾類A,B,C之上的通用功能......直接將此功能添加到A,B,C將打破擁有此裝飾器的優勢。此外,裝飾器可以動態改變;在這裏我只用一個裝飾器做了一個簡單的例子。 – 2012-02-13 13:55:50

回答

3

您可以在每個裝飾器上使用requestInjection(Object instance)

+0

在我的情況下,我只需要注入裝飾實例,所以調用'serve(「/ a」)。(新的裝飾器(注入(新的A())))'會做到這一點,'inject()'一個幫助函數,只是調用'requestInjection()'並返回實例。但不知何故,我感覺不好寫這篇文章,我有這樣的印象,這是誤用DI一點。 – 2012-02-13 15:17:40

+0

我想我明白你的感受。你想用某種方式說服serve(「/ a *」)。(Decorator.class).using(A.class); (語法不正確,但它表達了你想要的東西)。不幸的是,我對Guice的知識並沒有達到這個程度。 – 2012-02-13 15:46:04

1

我創建了一個小的開源項目,可以輕鬆集成hessian和guice。您可以使用基於註解的配置是這樣的: 的WebService:

@HessianWebService 
public class UserServiceImpl implements UserService { 
    ... 
} 

吉斯配置:

public class WebServiceGuiceServletContextListener extends GuiceServletContextListener { 
    @Override 
    protected Injector getInjector() { 
     return Guice.createInjector(
       /* your guice modules */ 
       new HessianWebServicesModule("your web service implementations package") 
     ); 
    } 
} 

或使用EDSL手動方式:

public class WebServiceGuiceServletContextListener extends GuiceServletContextListener { 
    @Override 
    protected Injector getInjector() { 
     return Guice.createInjector(
       /* your guice modules */ 
       new HessianWebServicesModule(){ 
        @Override 
        protected void configureHessianWebServices() { 
         serveHessianWebService(UserService.class).usingUrl("/Users"); 
        } 
       } 
     ); 
    } 
} 

更多信息,配置選項和完整的例子可在這裏:https://bitbucket.org/richard_hauswald/hessian-guice/