【问题标题】:GWT: Servlet URL mapping gives a 404 errorGWT:Servlet URL 映射给出 404 错误
【发布时间】:2011-10-03 05:30:20
【问题描述】:

我已阅读其他 GWT Servlet 问题,但我仍然无法解决我的问题。我的包名为 Maps,它有一个名为 MyService 的服务(根据 GWT 教程设置)。 web.xml 文件包括以下内容:

<servlet>
    <servlet-name>MyServiceImpl</servlet-name>
    <servlet-class>com.xerox.maps.maps.server.MyServiceImpl</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>MyServiceImpl</servlet-name>
    <url-pattern>/Maps/service</url-pattern>
</servlet-mapping>

在 MyService 中,我有一行:

@RemoteServiceRelativePath("service")
public interface MyService extends RemoteService { ...

但是,当我尝试进行 RPC 调用时,会引发错误。错误的详细信息表明这是一个 404 HTTP 错误。我该如何解决这个问题,以确保映射正确?

编辑 7.27

MyService.java 包含注解:

@RemoteServiceRelativePath("service")

而 web.xml 包含:

<servlet-name>MyServiceImpl</servlet-name>
<url-pattern>/com.x.maps.Maps/service</url-pattern>

如果我使用 FireBug 跟踪 XHR,它会告诉我有对 com.x.maps.Maps 的调用

【问题讨论】:

  • 你有教程的链接吗?我最近一直在用 GWT 编码,也许能提供帮助。(如果我看到问题:))
  • 当然:我主要使用this one,以及this other tutorial。谢谢!
  • 如何在 xml 文件中设置入口点?你在使用 rpc.AsyncCallback 吗?
  • 我在客户端代码中使用 rpc.AsyncCallback,但我不确定如何在 xml 文件中设置入口点——教程中的入口点在哪里?

标签: eclipse gwt servlets


【解决方案1】:

404 Not found 通常在 GWT 错误推断服务端点路径时抛出。尝试删除 @RemoteServiceRelativePath("service") 并重新编译并检查,如果这不起作用手动找出服务的 URL 端点(通过从浏览器中点击可能的路径,直到错误更改为 500 内部错误),然后将正确的路径作为参数提供给@RemoteServiceRelativePath("correct/path")。我会立即尝试的几个试验是 @RemoteServiceRelativePath("/Maps/service")@RemoteServiceRelativePath("Maps/service") 没有斜线

【讨论】:

  • 127.0.0.1:8888/Maps.html?gwt.codesvr=127.0.0.1:9997中加载代码时如何更改路径?
  • 您是否尝试过删除 RemoteServiceRelativePath 注释?并回答您关于如何更改路径的问题:使用 firebug Net 面板并转到 XHR 部分(XmlHttpRequests)并首先找出正在发出的请求以及到哪个路径。知道这一点后,将 GWT.create() 返回的对象转换为 RemoteServiceProxy 并在其上调用 setServiceEndpoint() 方法,并使用正确的路径或正确的服务端点
  • 我确实尝试删除注释——它应该与 标记匹配吗?而且我不确定萤火虫是什么;我正在使用 Eclipse。很抱歉,我花了这么长时间才知道,但 GWT 和 servlet 对我来说是非常新的。
  • 我正在从 Eclipse 编译,我不确定您所指的 Firebug Net 面板在哪里。我很抱歉没有更多地了解 GWT;我之前的编码经验是尽可能远离服务器。
  • addons.mozilla.org/en-US/firefox/addon/firebug - Firebug 是一个 firefox 插件,它有网络面板,而不是 Eclipse。它会准确地告诉您服务调用的 URL/端点,发送的数据是什么,接收的响应/数据是什么。使用它,启用后查看网络面板的 XHR 选项卡,然后告诉我 2 个示例,说明您的服务调用正在访问哪个 URL。
【解决方案2】:

根据本教程: https://developers.google.com/web-toolkit/doc/latest/tutorial/RPC

servlet-mapping 应该由模块“rename-to”和服务“RemoteServiceRelativePath”组成。因此,如果您的 *.gwt.xml 文件中有以下行:

<module rename-to='XXX'>

在您的 *Service.java 文件中,您有以下行:

@RemoteServiceRelativePath("YYY")

然后,在您的“web.xml”文件中,您应该有以下几行:

  <servlet-mapping>
    <servlet-name>...servlet-name>
    <url-pattern>/XXX/YYY</url-pattern>
  </servlet-mapping>

【讨论】:

    【解决方案3】:

    所有 cmets 之后的新答案:

    酷,你进步了! 您正在点击此网址 -

    http://127.0.0.1:8888/com.x.maps.maps.Maps
    

    我假设有了这个 POST 数据 - /%7C98544A4AED8C7D42E80C55859E9CEC4C%7Ccom.x.maps.maps.client.MyService%7CreadFile%7Cjava.lang.String/2004016611%7CPrinterList.xls%7C1%7C2%7C3%7C4%7C1%7C5%7C6%7C

    这就是问题所在,您的 servlet 被映射为响应来到 &lt;url-pattern&gt;/Maps/service&lt;/url-pattern&gt; 的 XHR 请求,但您却点击了 /com.x.maps.maps.Maps。因此,您将获得 404 path not found 状态代码。

    Alter the url-pattern on the server-side web.xml to match what the browser is making,
    OR
    Alter the GWT code using the RemoteServiceRelativePath annotation to make the request to /Maps/service instead of to /com.x.maps.maps.Maps
    

    【讨论】:

    • 我明天试试。感谢您对此非常耐心-我知道这会很乏味
    • 不用担心,配置总是让人头疼,直到你让它工作:)
    • 好的,我正在编辑我的问题以显示最新配置。我尝试编辑 url 模式,但我的 404 仍然存在。
    【解决方案4】:

    我遇到了同样的问题,但我通过更改 web.xml 中 Servlet 的 url-pattern 解决了它

    尝试在 web.xml 中放入生成 GWT javascript 模块的目录的路径,位于 WEB-INF/deploy 后面。就我而言:

    <url-pattern>/gwtmodulemain/selection</url-pattern>
    

    您还可以在 gwt.xml 文件中重命名模块名称:

    <module rename-to='gwtmodulemain'>
    

    因此您可以通过这种方式从 HTML 中引用您的模块:

    <script type="text/javascript" language="javascript" src="gwtmodulemain/gwtmodulemain.nocache.js"></script>
    

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多