在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 ......
为了帮助确定问题,真正的代码使用了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;
}
答案 0 :(得分:3)
您可以在每个装饰器上使用requestInjection(Object instance)
。
答案 1 :(得分:1)
我创建了一个小型开源项目,可以轻松集成hessian和guice。您可以使用基于注释的配置,如下所示: WebService的:
@HessianWebService
public class UserServiceImpl implements UserService {
...
}
Guice配置:
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/