RPC调用的GWT Tomcat问题
Posted
技术标签:
【中文标题】RPC调用的GWT Tomcat问题【英文标题】:GWT Tomcat problem to RPC call 【发布时间】:2011-04-13 13:34:34 【问题描述】:当我将我的 war 文件部署到 TOMCAT (tomcat/webapps/ROOT/war) 时,GWT RPC 调用似乎不起作用。
它给了我一个错误:
请求的资源 (/war/myproject/call) 不是 可用。
如果我更改目录结构,然后直接部署战争内容(不是战争目录本身),例如(tomcat/webapps/ROOT/project.html、project.css、project 等... ) 然后它就可以工作了。
谁能解释一下这是怎么回事?
我认为可能有问题:
<servlet>
<servlet-name>callServlet</servlet-name>
<servlet-class>com.myproject.server.dao.Call</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>callServlet</servlet-name>
<url-pattern>/myproject/call</url-pattern>
</servlet-mapping>
【问题讨论】:
【参考方案1】:问题是单个 Tomcat 服务器可以部署多个应用程序,每个应用程序都在其所谓的 context 中。应用程序部署在webapps
文件夹中,每个文件夹都映射到一个context,而ROOT
文件夹是默认文件夹(无上下文)。
要访问 Tomcat 上的应用程序,您需要在 URL 之后指定 context。例如,如果您在 webapps/Test
文件夹中有一个应用程序(上下文)Test
,您可以这样访问它:
http://localhost:8080/Test
但ROOT
文件夹中的应用程序没有上下文,只需转到localhost:8080
即可访问。这是你的情况。 Tomcat 直接在 ROOT
文件夹中寻找您的应用程序,但您的应用程序位于 ROOT/war
文件夹中。换句话说,RPC 调用期望myproject
文件夹位于ROOT
文件夹下,而不是ROOT/war
文件夹下。这就是它不起作用的原因。
如果您仍希望将war
文件夹放在ROOT
文件夹中,则必须将url-pattern
更改为/war/myProject/call
。
【讨论】:
非常好的答案,请告诉我如何更改@RemoteServiceRelative 工作路径。 我想现在您的注释看起来像这样:@RemoteServiceRelativePath("myProject")。我认为您需要将其更改为 @RemoteServiceRelativePath("war/myProject") 以使其符合url-pattern
。但我个人会将应用程序直接放入ROOT
文件夹,或放入不同的上下文中,例如webapps/MyProject
.
好吧,情况是我将我的项目部署到 cloudbees。我选择了一个简单的 .war 文件进行上传。它会自动部署 localhost:8080/war/Myproject.html ,不能用 localhost:8080/Myproject.html 访问它
我把它改成@RemoteServiceRelativePath("war/myProject"),它给了我404 not found请求的URI
哦,那就试试把url-pattern改成<url-pattern>/war/myproject/call</url-pattern>
,把注解改成@RemoteServiceRelativePath("myProject")
【参考方案2】:
嗯,我找到了解决方案,它与Tomcat的操作方式有关。
-
打开你的项目war目录
选择所有文件(html/jsp、图像、WEB-INF 等...)
将所有文件压缩到一个 project.zip 存档中
将 project.zip 重命名为 project.war
将 project.war 复制到 Tomcat/webapps/
重启 Tomcat 服务器
现在你会注意到在 webapps 目录里面 project.war 已经被解压到一个项目目录中,如果你打开它你会发现所有的 .war 内容(html/jsp, images, WEB-INF, etc...)
从这里访问它 http://localhost/project 或 http://localhost/project/index.html 或 index.jsp。
错误是:我只是将 war 目录(不是内部内容)压缩到 project.war 中。
【讨论】:
和@RemoteServiceRelativePath("call"),看起来,servlet 没有为你初始化战争尝试将 SERVLET 标记更改为 即添加标签
<load-on-startup>1</load-on-startup>
这个标签确保 servlet 应该被加载
<servlet>
<servlet-name>callServlet</servlet-name>
<servlet-class>com.myproject.server.dao.Call</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
希望这会奏效
【讨论】:
部署后有没有重启服务器,试试看,应该可以的 @Imran 我做到了,我认为这是一个小错误。我使用将 JAVA 编译为 javascript 的 GWT,我没有重新编译... 再尝试 1 件事不要把战争放在 ROOT 文件夹中,直接放在 webapp 下,即 $tomcat\webapps\yourproject.war以上是关于RPC调用的GWT Tomcat问题的主要内容,如果未能解决你的问题,请参考以下文章
我在 tomcat 上部署了 GWT,现在 RPC 不起作用
将带有 RPC 的 GWT 部署到 tomcat 的问题(可能是 web.xml 问题)
Tomcat 和 Objectdb(通过 GWT/Rpc):java.lang.NoClassDefFoundError
GWT Servlet 错误 com.google.gwt.user.client.rpc .StatusCodeException: Tomcat 服务器上的 404