GWT RPC 警告:servlet 有映射,但 web.xml 没有对应的映射
Posted
技术标签:
【中文标题】GWT RPC 警告:servlet 有映射,但 web.xml 没有对应的映射【英文标题】:GWT RPC Warning: servlet has mapping, but web.xml has no corresponding mapping 【发布时间】:2011-03-30 18:25:09 【问题描述】:我在使用 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
【问题讨论】:
试试<url-pattern>/login/*</url-pattern>
看看是否可行。
【参考方案1】:
您可能已将 .gwt.xml 文件中的 rename-to
属性定义为:
<module rename-to='login'>
您的 LoginService(接口!)可能包含注释
@RemoteServiceRelativePath("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.
*/
【讨论】:
但这是否意味着服务托管在 /login/login 上?我正在向 /login 提出我的请求,我得到了很好的回应。我尝试了您的修复方法,但似乎没有什么不同。 @Travis:web.xml 指定了服务的托管位置。所以如果你指定<url-pattern>/login</url-pattern>
,那么服务将托管在“/login”。
我很快就尝试了我的解决方案,它实际上按我的预期工作。 setEntryPoint
方法不会改变服务器上的任何东西——它只是告诉客户端它应该调用哪个服务器 URL(在这种情况下:“www.example.org/login”)。你说,它没有用......也许从你的 .gwt.xml 中删除 <servlet ...>
行(看起来像旧样式)。【参考方案2】:
我解决了它,但仍然指向任何可以告诉我为什么的人。我从我的模块定义中删除了这个:
<servlet path="/login" class="x.y.server.LoginServiceImpl" />
现在一切正常,没有任何警告。问题:为什么首先指示我把它放在那里?它有什么用途?
-tjw
【讨论】:
啊,我看到你已经删除了它。您在哪里阅读了该说明? 该行允许在“DevMode”期间加载 servlet,但在生产模式下,这些 servlet 是从“web.xml”中提取的。但是,如果你有像 Spring 这样的 IoC/DM,那么你需要将你的 DevMode 指向一个正在运行的 Tomcat/Jetty,这样你的 RPC 仍然可以提供服务。【参考方案3】:如果您使用的是 Netbeans,它会在模块文件中说:“不要在此处定义 servlet,使用 web.xml”。
http://code.google.com/webtoolkit/doc/latest/DevGuideOrganizingProjects.html#DevGuideModuleXml说:
: 对于 RPC,此元素加载安装在指定 URL 路径的 servlet 类。 URL 路径应该是绝对的并且具有目录的形式(例如,/calendar)。然后,您的客户端代码通过使用 @RemoteServiceRelativePath 属性注释服务接口来指定此 URL 映射。可以以这种方式加载任意数量的 servlet,包括来自继承模块的那些。
该元素仅适用于 GWT 的嵌入式服务器服务器端调试功能。
注意:从 GWT 1.6 开始,此标记不再在开发模式下加载 servlet,而是您必须在您的 war 目录中配置 WEB-INF/web.xml 以加载所需的任何 servlet。
【讨论】:
以上是关于GWT RPC 警告:servlet 有映射,但 web.xml 没有对应的映射的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 GWT-RPC 以外的方式访问 GWT servlet?
我在 tomcat 上部署了 GWT,现在 RPC 不起作用
GWT Servlet 错误 com.google.gwt.user.client.rpc .StatusCodeException: Tomcat 服务器上的 404