我正在重构一个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
答案 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注入了所有。