4

给定 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()));

因此,在这种情况下,完整的解决方案是注入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;
}
4

2 回答 2

3

您可以requestInjection(Object instance)在每个装饰器上使用。

于 2012-02-13T14:42:28.613 回答
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/

于 2014-05-03T15:25:08.023 回答