2010-08-30 75 views
0

我们正在研究一些新兴项目的技术,我真的想用Guice作为我们的依赖注入框架,我也希望使用Hessian作为客户/服务器通信,但它似乎并不兼容吉斯。如何将Hessian与Guice集成?

public class WebMobule extends ServletModule { 

@Override 
protected void configureServlets() { 

    serve("/fileupload").with(FileUploadServlet.class); 

    // this doesn't work! AuthenticationServlet extends HessianServlet 
    // HessianServlet extends GenericServlet - Guice wants something that extends 
    // HttpServlet 
    serve("/authentication").with(AuthenticationServlet.class); 

} 

有没有人设法解决这个问题 - 如果是的话,你是怎么做到的?

欢呼

菲尔

回答

2

我会写其中延伸的HttpServlet和委托方法调用到封装HessianServlet定制HessianHttpServlet。通过这种方式,Guice服务调用将被满足,并且您将使用HessianServlet行为。

0

它需要一些工作,但从根本上我这个解决了这个问题(感谢语法!):

@Singleton 
public class AuthenticationWrapperServlet extends HttpServlet { 

    private static final Logger LOG = Logger.getLogger(HessianDelegateServlet.class); 

    // this is the HessianServlet 
    private AuthenticationServlet authenticationServlet; 

    @Override 
    public void init(ServletConfig config) throws ServletException { 
     LOG.trace("init() in"); 
     try { 
      if (authenticationServlet == null) { 
       authenticationServlet = new AuthenticationServlet(); 
      } 
      authenticationServlet.init(config); 
     } catch (Throwable t) { 
      LOG.error("Error initialising hessian servlet", t); 
      throw new ServletException(t); 
     } 
     LOG.trace("init() out"); 
    } 

    @Override 
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { 

     try { 
      authenticationServlet.service(request, response); 
     } catch (Throwable t) { 
      LOG.error("Error calling service()", t); 
      throw new ServletException(t); 
     } 

    } 
} 
0

我创建了一个小的开源项目,它能够方便地集成Hessian和吉斯的。您可以使用基于注解的配置是这样的: 的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/