servlet.init()的GWT,Guice ServletModule和GWT RPC问题

时间:2011-04-06 10:51:58

标签: gwt guice

我正在重构一个GWT应用程序和Guice中的管道,以删除我们的web.xml中开发的一些内容。我正在使用guice来映射GWT客户端代码调用的RPC服务。大致遵循这里概述的方法。 http://stuffthathappens.com/blog/2009/09/14/guice-with-gwt/

这种方法需要远离扩展RemoteServiceServlet,但也意味着我不再能够访问通常可通过ServletApi获得的init(),shutdown()和destroy()方法。

对于我们开发的大多数服务而言,这不是问题,但在一个案例中,我偶然发现了我们服务中的一段代码,这些代码依赖于使用init()创建一个传入引用的对象servlet并启动一个线程,该线程调用servlet类上的方法,该方法轮询服务并维护可由GWT服务使用的缓存。请参阅下面的代码(为了清晰起见缩短了)

public class MyServiceImpl extends RemoteServiceServlet implements MyService{

      private CacheRefresh cr = null;

     public void init(ServletConfig servletConfig){
       super.init(servletConfig);
       cr = new CachRefresh(servletContext, this)  ;
       cr.start();
     }

     public String someMethod(){ .. }
}

public class CacheRefresh extends Thread{
       public CacheRefresh(ServletContext context, MyServiceImpl servlet){
          ...    
       }    

       public void run(){
         context.setAttribute("A_MAP_KEY", servlet.someMethod() )    
       }
}

我很欣赏以这种方式使用Threads也可能不是一个好主意。这是我继承的代码,我会在适当的时候做些更好的事情。

有没有人对如何解决这个问题有任何好的想法?我能想到的唯一选择是保留它并通过web.xml文件中的映射进行配置。我不喜欢在大量的地方进行配置,像小鬼一样散落在周围的想法。

欢迎任何建议。

编辑 - 我们正在使用Guice 2.0

1 个答案:

答案 0 :(得分:0)

这是一个旧帖子,但为了后人的缘故,一个类似的问题包含我认为你正在寻找的答案:GWT RPC GWTTestCase + GUICE 2.0

即(主要取自Will在上述问题中给出的答案),在配置ServletModule的地方添加:

serve("/myapp/yourservice").with(YourServiceImpl.class);

然后将你的GWT-RPC类保持原样,除了添加一些Guice注释:

@Singleton
public class YourServiceImpl extends RemoteServiceServlet implements YourService {

    private Provider<SimpleDao> daoProvider;
    private OtherGuiceManagedObj obj;

    @Inject
    public YourServiceImpl(Provider<SimpleDao> daoProvider, OtherGuiceManagedObj obj) {
        this.daoProvider = daoProvider;
        this.obj = obj;
    }

    // ... RPC method implementations
}

但是,您仍需要在服务接口声明中使用@RemoteServiceRelativePath注释复制服务路径,但这并不比使用web.xml更糟糕。 (您可能会编写一些内容来扫描使用@RemoteServiceRelativePath注释的服务接口的某些路径,并在启动时添加Guice servlet serve().with()调用,但可能不值得这么做。)

@RemoteServiceRelativePath("yourservice")
public interface YourService extends RemoteService { 
    // ... 
}

之前我已经完成了这项工作,它按预期工作,Guice注入了所有。