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

【问题讨论】:

试试&lt;url-pattern&gt;/login/*&lt;/url-pattern&gt; 看看是否可行。 【参考方案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 指定了服务的托管位置。所以如果你指定&lt;url-pattern&gt;/login&lt;/url-pattern&gt;,那么服务将托管在“/login”。 我很快就尝试了我的解决方案,它实际上按我的预期工作。 setEntryPoint 方法不会改变服务器上的任何东西——它只是告诉客户端它应该调用哪个服务器 URL(在这种情况下:“www.example.org/login”)。你说,它没有用......也许从你的 .gwt.xml 中删除 &lt;servlet ...&gt; 行(看起来像旧样式)。【参考方案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?

GWT RPC 警告检查所有子类型

我在 tomcat 上部署了 GWT,现在 RPC 不起作用

servlet 的 GWT RPC 服务分配异常

GWT Servlet 错误 com.google.gwt.user.client.rpc .StatusCodeException: Tomcat 服务器上的 404

RPC 的 GWT Servlet 模型是单线程模型,还是如何通过 GWT 实现高可用性?