混合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