给定 Guice servlet 模块中的以下代码configureServlets()
:
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 混合...
为了帮助解决这个问题,真实的代码使用了 Hessian 的 web 服务。在网上挖掘之后,目前还没有关于这个问题的正确答案(我见过很多丑陋的黑客),纪尧姆给出的解决方案符合这个精确案例的要求。
总结原始问题:要使用 Hessian 实现 Web 服务,必须实现一个HessianServlet
,即 a 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;
}