2012-12-12 23 views
0

我想熟悉使用GWT API来创建基于Web的应用程序。我一直在关注GWT的一些教程,并且还没有能够进行RPC调用。从广泛的角度来看问题,我的目标是做一个服务器调用来运行一系列我知道工作的数据库测试(我测试过这个代码)。GWT rpc失败 - 基地址不是我所期望的

---编辑---

我觉得这里的问题是,资源正在寻找在这里: /MatesWeb/org.matesweb.Main/peopleService

时,我认为这应该看这里: /MatesWeb/peopleService

--- END_EDIT ---

这里是信息和代码,我觉得是相关的:

- 使用NetBeans的

- 错误,我得到的是“/MatesWeb/org.matesweb.Main/PeopleService - 描述 - 请求的资源不可用。”

-GWT.getModuleBaseURL()返回:8080/MatesWeb/org.matesweb.Main/

在浏览器-URL是:8080/MatesWeb/

从web.xml文件

<servlet> 
    <servlet-name>peopleService</servlet-name> 
    <servlet-class>org.matesweb.server.PeopleServiceImpl</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>peopleService</servlet-name> 
    <url-pattern>/peopleService</url-pattern> 
</servlet-mapping> 

From PeopleService Service package org.matesweb.client;

import com.google.gwt.user.client.rpc.RemoteService; 
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath; 

@RemoteServiceRelativePath("PeopleService") 
public interface PeopleService extends RemoteService { 

String[] saveGetPerson(String[] persInfo); 
int runTests(); 

} 

从PeopleServiceImpl 包org.matesweb.server;

import com.google.gwt.user.server.rpc.RemoteServiceServlet; 
import org.matesweb.client.PeopleService; 

import org.matesweb.server.tests.DbTest; 

class PeopleServiceImpl extends RemoteServiceServlet implements PeopleService { 

    @Override 
    public String[] saveGetPerson(String[] persInfo) { 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    @Override 
    public int runTests() 
    { 
     int retInt; 

     DbTest dbTest = new DbTest(); 
     retInt = dbTest.runTests(); 
     return retInt; 
    } 

} 

从PeopleServiceAsync

package org.matesweb.client; 

import com.google.gwt.user.client.rpc.AsyncCallback; 

public interface PeopleServiceAsync 
{ 
    void saveGetPerson(String[] persInfo, AsyncCallback<String[]> persInformation); 
    void runTests(AsyncCallback<Integer> retInt); 
} 

的任何想法什么怎么回事?

干杯, 尼克

回答

1
@RemoteServiceRelativePath("PeopleService") 

@RemoteServiceRelativePath注解是用来决定打什么网址。这路径服务器是相对来编译模块本身 - 从路径/MatesWeb/org.matesweb.Main/加载的GWT应用程序,因此该服务在/MatesWeb/org.matesweb.Main/PeopleService被找到了。我假设这意味着你在MatesWeb/目录中有一个html文件(可能.war文件被称为MatesWeb?),并且里面存在编译的应用程序org.matesweb.Main/,包括最初的JS文件org.matesweb.Main.nocache.js

如果你想告诉服务在/MatesWeb/peopleService找到,你有两种选择。首先是修改注释备份目录,是这样的:

@RemoteServiceRelativePath("../peopleService") 

使用..,我指示父目录,我也改变了路径的一部分“peopleService”的情况下 - 这可能或可能无关紧要。第二个选择是通过编程设置的网址:

PeopleServiceAsync service = GWT.create(PeopleService.class); 
((ServiceDefTarget)service).setServiceEntryPoint("/MatesWeb/peopleService"); 

正如@RemoteServiceRelativePath的javadoc http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/user/client/rpc/RemoteServiceRelativePath.html引用。

如果您想让客户端保持原样并告诉服务器该服务应该位于客户端期望的路径上,则可以修改web.xml以使servlet在当前客户端的路径上可用期待找到它:

<servlet-mapping> 
    <servlet-name>peopleService</servlet-name> 
    <url-pattern>/MatesWeb/org.matesweb.Main/PeopleService</url-pattern> 
</servlet-mapping> 

再次请注意,我已经改变了案件 - 它可能并不重要,但我通常喜欢是一致的。

0

第一直觉是PeopleService必须在@RemoteServiceRelativePath peopleService。请使用萤火虫监控您的RPC请求。您可以轻松地观察并验证这些请求url问题。

更新在web.xml中的URL模式在这里

<url-pattern>/org.matesweb.Main/greet</url-pattern> 
+0

我试着改变它,它似乎没有任何帮助。我认为这里的问题是这里的资源正在寻找: /MatesWeb/org.matesweb.Main/peopleService 当我认为它应该在这里寻找: /MatesWeb/peopleService – nmio