2012-02-13 45 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/