是否可以以编程方式更改 GWT RPC servlet 路径?

Posted

技术标签:

【中文标题】是否可以以编程方式更改 GWT RPC servlet 路径?【英文标题】:Is it possible to programmatically change GWT RPC servlet path? 【发布时间】:2011-04-05 14:38:52 【问题描述】:

从http://localhost:8080/myapp 运行时,我的 GWT 应用程序运行良好。

我需要在本质上是代理的背后托管 gwt 应用程序。当在代理后面时,url 会变成类似http://localhost:8080/foo/bar/00_00_00/myapp 的东西。

当我尝试在代理后面访问时,Gwt 抛出错误:

myAppServlet:错误:模块路径 要求, /foo/bar/00_00_00/myapp/MyApp/,不是 在与此相同的 Web 应用程序中 小服务程序,/myapp。您的模块可能不会 正确配置或您的客户端 并且服务器代码可能已过时。

当 gwt 尝试序列化 java 对象并将它们发送回客户端时,该错误似乎发生在 rpc 请求之后。

有什么方法可以通知 GWT 该应用程序位于代理后面?

更新:

第一个请求似乎工作正常。但是对于所有其他请求它都​​失败了??!! 我发现错误来自 RemoteServiceServlet.loadSerializationPolicy。不幸的是,我无法覆盖,因为它是静态的。

也许可以通过编程方式设置 servlet 上下文路径?

【问题讨论】:

【参考方案1】:

我不确定这是否会解决整个问题,因为您说它在您第一次拨打电话时已经有效 - 但是您可以在客户端创建 serviceAsync 时尝试以下操作:

MyServiceAsync service = GWT.create(MyService.class);
ServiceDefTarget serviceDefTarget = (ServiceDefTarget) service;
serviceDefTarget.setServiceEntryPoint(
     "http://localhost:8080/foo/bar/00_00_00/myapp/MyApp/");
   /* ^^ Use your full servlet path here ^^ */

如果您想知道为什么必须将其显式转换为 ServiceDefTarget - 这是来自 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.
 */

(我假设您正在从“http://localhost:8080”加载您的 html 主机页面,否则会因为同源策略而失败。)

我可以想象的另一个问题可能与您的代理中的缓存有关 - 所以可能先尝试关闭任何缓存,然后仅为具有"*.cache.*" 文件名的资源重新启用它(另请参见:Ideal HTTP cache control headers for different types of resources)。

【讨论】:

谢谢,这为我指明了正确的方向。我的 web.xml 将我的服务的 url 映射定义为 /myapp。但我终于意识到,您必须将 servlet url 映射到所有 compile gwt js 内容所在的相同 url。因此,我将 servlet 的 url-mapping 更改为 /MyApp/myapp。我的 GWT 模块名为 MyApp。所以,既然两条路径匹配,它就可以工作了!

以上是关于是否可以以编程方式更改 GWT RPC servlet 路径?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以通过 GWT RPC Servlet 上传文件?

是否可以将 GWT EntityProxy 与 RPC 调用一起使用?

是否可以在 smartgwt 中使用 gwt rpc?

当我更改端点时,GWT RPC 调用不起作用

如何解决在 GWT 中等待 RPC 响应的问题?

是否可以为每个 GWT RPC 调用无缝显示一个 ajax 微调器?