我对GWT-RPC有一个奇怪的问题。我设置了一个工作正常的Async
RPC处理程序。但是当我运行我的服务器(使用ant devmode
)时,我收到以下警告:
[WARN] Module declares a servlet class 'x.y.server.LoginServiceImpl'
with a mapping to '/login/login', but the web.xml has no corresponding mapping
要清楚,我的代码中没有指定“/ login / login”。我想只使用 / login 。为什么要两次添加?它几乎看起来像一个GWT错误。以下是配置的其余部分:
我的web.xml servlet-mapping
如下所示:
<servlet-mapping>
<servlet-name>LoginServiceImpl</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
我的模块文件包含以下内容:
<servlet path="/login" class="x.y.server.LoginServiceImpl" />
那么为什么我在任何地方都没有定义 / login / login 的警告?感谢任何帮助。谢谢。
-tjw
答案 0 :(得分:4)
您可能已将.gwt.xml文件中的rename-to
属性定义为:
<module rename-to='login'>
您的LoginService(界面!)可能包含注释
@RemoteServiceRelativePath("login")
生成的路径(即客户端调用的路径)然后是“/ login / login”。
我不确定,如果你能轻松实现“/ login”,但是你能尝试的是:
LoginServiceAsync service = GWT.create(LoginService.class);
ServiceDefTarget serviceDefTarget = (ServiceDefTarget) service;
serviceDefTarget.setServiceEntryPoint(GWT.getHostPageBaseURL() + "login");
我没有测试过,所以这可能需要稍微调整一下(?)。来自ServiceDefTarget的Javadoc:
/**
* An interface implemented by client-side RPC proxy objects. Cast the object
* returned from {@link com.google.gwt.core.client.GWT#create(Class)} on a
* {@link RemoteService} to this interface to initialize the target URL for the
* remote service.
*/
答案 1 :(得分:1)
我解决了这个问题,但仍然指向任何可以告诉我为什么的人。我从模块定义中删除了它:
<servlet path="/login" class="x.y.server.LoginServiceImpl" />
现在一切正常,没有任何警告。问题:为什么我被指示将其置于首位?它有什么用途?
-tjw
答案 2 :(得分:1)
如果您使用的是Netbeans,它会在模块文件中说:“不要在这里定义servlet,请使用web.xml”。
http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml说:
: 对于RPC,此元素加载在指定的URL路径上安装的servlet类。 URL路径应该是绝对路径,并且具有目录的形式(例如,/ calendar)。然后,您的客户端代码通过使用@RemoteServiceRelativePath属性注释服务接口来指定此URL映射。可以以这种方式加载任意数量的servlet,包括来自继承模块的servlet。
该元素仅适用于GWT的嵌入式服务器端服务器端调试功能。
注意:从GWT 1.6开始,此标记不再在开发模式下加载servlet,而是必须在war目录中配置WEB-INF / web.xml以加载所需的任何servlet。