在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定义新的提供者类。因此,理想的解决方案应该是通用的。
关于混合使用 Hessian 和 Guice...
为了明确问题,实际代码使用带有 Hessian 的 Web 服务。在网上搜索后,目前还没有关于这个问题的适当答案(我看过许多丑陋的黑客解决方法),而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;
}