是否可以以编程方式更改 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 路径?的主要内容,如果未能解决你的问题,请参考以下文章