GWT简单RPC用例问题:包含代码
我正在尝试解决如何使用GWT RPC将域对象从服务器端发送到客户端。我编写了一个非常简单的用例,它代表了我(和其他人?)需要做但目前无法开始工作的事情 我已经浏览了文档、教程和论坛,但它们要么显示传递的字符串,要么提供(当我将它们应用于此时)仍然不起作用的解释 希望有人能向我和其他人解释为什么这个代码不起作用,以及如何让它起作用 多谢各位 以下是错误消息GWT简单RPC用例问题:包含代码,gwt,rpc,gwt-rpc,Gwt,Rpc,Gwt Rpc,我正在尝试解决如何使用GWT RPC将域对象从服务器端发送到客户端。我编写了一个非常简单的用例,它代表了我(和其他人?)需要做但目前无法开始工作的事情 我已经浏览了文档、教程和论坛,但它们要么显示传递的字符串,要么提供(当我将它们应用于此时)仍然不起作用的解释 希望有人能向我和其他人解释为什么这个代码不起作用,以及如何让它起作用 多谢各位 以下是错误消息 13:12:54.328 [DEBUG] [org.redboffin.worldhug.Test] Validating newly com
13:12:54.328 [DEBUG] [org.redboffin.worldhug.Test] Validating newly compiled units
13:12:54.328 [ERROR] [org.redboffin.worldhug.Test] Errors in 'file:/C:/Documents%20and%20Settings/Darren/workspace/WorldHug/src/org/redboffin/worldhug/client/test/TestService.java'
13:12:54.343 [ERROR] [org.redboffin.worldhug.Test] Line 14: No source code is available for type org.redboffin.worldhug.server.test.TestObject; did you forget to inherit a required module?
13:12:54.515 [ERROR] [org.redboffin.worldhug.Test] Errors in 'file:/C:/Documents%20and%20Settings/Darren/workspace/WorldHug/src/org/redboffin/worldhug/client/test/TestServiceAsync.java'
13:12:54.515 [ERROR] [org.redboffin.worldhug.Test] Line 12: No source code is available for type org.redboffin.worldhug.server.test.TestObject; did you forget to inherit a required module?
13:12:55.953 [ERROR] [org.redboffin.worldhug.Test] Errors in 'file:/C:/Documents%20and%20Settings/Darren/workspace/WorldHug/src/org/redboffin/worldhug/client/test/TestView.java'
13:12:55.968 [ERROR] [org.redboffin.worldhug.Test] Line 42: No source code is available for type org.redboffin.worldhug.server.test.TestObject; did you forget to inherit a required module?
13:12:55.968 [ERROR] [org.redboffin.worldhug.Test] Line 46: No source code is available for type org.redboffin.worldhug.server.test.InnerObject; did you forget to inherit a required module?
13:12:55.984 [ERROR] [org.redboffin.worldhug.Test] Line 48: No source code is available for type org.redboffin.worldhug.server.test.ListObject; did you forget to inherit a required module?
13:12:56.765 [INFO] [org.redboffin.worldhug.Test] Module org.redboffin.worldhug.Test has been loaded
以下是项目类和文件
Test.gwt.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.0.0//EN" "http://google-web-toolkit.googlecode.com/svn/tags/2.0.0/distro-source/core/src/gwt-module.dtd">
<module>
<inherits name="com.google.gwt.user.User" />
<source path="client/test" />
<entry-point class="org.redboffin.worldhug.client.test.Test"></entry-point>
</module>
ListObject.java
package org.redboffin.worldhug.server.test;
import java.util.ArrayList;
import java.util.List;
import com.google.gwt.user.client.rpc.IsSerializable;
public class TestObject implements IsSerializable {
private String testObjectString;
private InnerObject innerObject;
private List<ListObject> listObjects = new ArrayList<ListObject>();
public TestObject() {}
// Getters and setters removed for brevity
}
package org.redboffin.worldhug.server.test;
import com.google.gwt.user.client.rpc.IsSerializable;
public class InnerObject implements IsSerializable {
private String innerObjectString;
public InnerObject() {}
// Getters and setters removed for brevity
}
package org.redboffin.worldhug.server.test;
import com.google.gwt.user.client.rpc.IsSerializable;
public class ListObject implements IsSerializable {
private String listObjectString;
public ListObject() {}
// Getters and setters removed for brevity.
}
TestService.java
package org.redboffin.worldhug.client.test;
import org.redboffin.worldhug.server.test.TestObject;
import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;
/**
* The client side stub for the Test Service.
* @author Darren
*/
@RemoteServiceRelativePath("testService")
public interface TestService extends RemoteService {
TestObject test();
}
TestServiceAsync.java
package org.redboffin.worldhug.client.test;
import org.redboffin.worldhug.server.test.TestObject;
import com.google.gwt.user.client.rpc.AsyncCallback;
/**
* The async counterpart of <code>TestService</code>.
* @author Darren
*/
public interface TestServiceAsync {
void test(AsyncCallback<TestObject> callback);
}
TestServiceImpl.java
package org.redboffin.worldhug.server.test;
import java.util.List;
import org.redboffin.worldhug.client.test.TestService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
/**
* The server side implementation of the RPC service.
* @author Darren
*/
@SuppressWarnings("serial")
public class TestServiceImpl extends RemoteServiceServlet implements TestService {
@Override
public TestObject test() {
TestObject testObject = new TestObject();
testObject.setTestObjectString("Test Object String");
InnerObject innerObject = new InnerObject();
innerObject.setInnerObjectString("Inner Object String");
testObject.setInnerObject(innerObject);
List<ListObject> listObjects = testObject.getListObjects();
ListObject listObjectOne = new ListObject();
listObjectOne.setListObjectString("List Object One");
listObjects.add(0, listObjectOne);
ListObject listObjectTwo = new ListObject();
listObjectTwo.setListObjectString("List Object Two");
listObjects.add(0, listObjectTwo);
ListObject listObjectThree = new ListObject();
listObjectThree.setListObjectString("List Object Three");
listObjects.add(0, listObjectThree);
return testObject;
}
}
package org.redboffin.worldchug.server.test;
导入java.util.List;
导入org.redboffin.worldchug.client.test.TestService;
导入com.google.gwt.user.server.rpc.RemoteServiceServlet;
/**
*RPC服务的服务器端实现。
*@作者达伦
*/
@抑制警告(“串行”)
公共类TestServiceImpl扩展RemoteServiceServlet实现TestService{
@凌驾
公共测试对象测试(){
TestObject TestObject=新的TestObject();
setestObjectString(“测试对象字符串”);
InnerObject InnerObject=新的InnerObject();
setInnerObjectString(“内部对象字符串”);
setInnerObject(innerObject);
List listObjects=testObject.getListObjects();
ListObject listObjectOne=新建ListObject();
setListObjectString(“列表对象一”);
添加(0,listObjectOne);
ListObject listObjectTwo=新建ListObject();
setListObjectString(“列表对象二”);
添加(0,ListObject2);
ListObject listObjectThree=新ListObject();
setListObjectString(“列表对象三”);
添加(0,listObjectThree);
返回testObject;
}
}
TestView.java
package org.redboffin.worldhug.client.test;
import java.util.ArrayList;
import java.util.Iterator;
import org.redboffin.worldhug.server.test.InnerObject;
import org.redboffin.worldhug.server.test.ListObject;
import org.redboffin.worldhug.server.test.TestObject;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.VerticalPanel;
public class TestView extends Composite {
private static TestViewUiBinder uiBinder = GWT.create(TestViewUiBinder.class);
interface TestViewUiBinder extends UiBinder<VerticalPanel, TestView> {}
@UiField Label testObjectStringLabel;
@UiField Label innerObjectStringLabel;
@UiField VerticalPanel listObjectsPanel;
@UiField Button button;
@UiField Label errorMessageLabel;
public TestView(String firstName) {
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler("button")
void onClick(ClickEvent e) {
TestServiceAsync testService = (TestServiceAsync) GWT.create(TestService.class);
AsyncCallback<TestObject> callback = new AsyncCallback<TestObject>() {
public void onSuccess(TestObject testObject) {
testObjectStringLabel.setText(testObject.getTestObjectString());
InnerObject innerObject = testObject.getInnerObject();
innerObjectStringLabel.setText(innerObject.getInnerObjectString());
ArrayList<ListObject> listObjects = (ArrayList<ListObject>) testObject.getListObjects();
Iterator<ListObject> iterator = listObjects.iterator();
while(iterator.hasNext()) {
ListObject listObject = (ListObject) iterator.next();
listObjectsPanel.add(new Label(listObject.getListObjectString()));
}
}
public void onFailure(Throwable caught) {
errorMessageLabel.setText("Error : "+caught.getMessage());
}
};
testService.test(callback);
}
}
package org.redboffin.worldhug.client.test;
导入java.util.ArrayList;
导入java.util.Iterator;
导入org.redboffin.worldchug.server.test.InnerObject;
导入org.redboffin.worldchug.server.test.ListObject;
导入org.redboffin.worldchug.server.test.TestObject;
导入com.google.gwt.core.client.gwt;
导入com.google.gwt.event.dom.client.ClickEvent;
导入com.google.gwt.uibinder.client.uibinder;
导入com.google.gwt.uibinder.client.UiField;
导入com.google.gwt.uibinder.client.UiHandler;
导入com.google.gwt.user.client.rpc.AsyncCallback;
导入com.google.gwt.user.client.ui.Button;
导入com.google.gwt.user.client.ui.Composite;
导入com.google.gwt.user.client.ui.Label;
导入com.google.gwt.user.client.ui.VerticalPanel;
公共类TestView扩展了复合{
私有静态TestViewUiBinder=GWT.create(TestViewUiBinder.class);
接口TestViewUiBinder扩展UiBinder{}
@UiField标签testObjectStringLabel;
@UiField标签innerObjectStringLabel;
@UiField垂直面板listObjectsPanel;
@UiField按钮;
@UiField标签errorMessageLabel;
公共测试视图(字符串名){
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler(“按钮”)
单击void onClick(单击事件e){
TestServiceAsync testService=(TestServiceAsync)GWT.create(testService.class);
AsyncCallback callback=新的AsyncCallback(){
成功时公共无效(TestObject TestObject){
testObjectStringLabel.setText(testObject.getTestObjectString());
InnerObject InnerObject=testObject.getInnerObject();
innerObjectStringLabel.setText(innerObject.getInnerObjectString());
ArrayList listObjects=(ArrayList)testObject.getListObjects();
迭代器迭代器=listObjects.Iterator();
while(iterator.hasNext()){
ListObject ListObject=(ListObject)迭代器.next();
添加(新标签(listObject.getListObjectString());
}
}
失败时的公共无效(可丢弃){
errorMessageLabel.setText(“错误:+catch.getMessage());
}
};
testService.test(回调);
}
}
TestView.ui.xml
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder
xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<g:VerticalPanel>
<g:Label>Test Object</g:Label>
<g:Label ui:field="testObjectStringLabel"></g:Label>
<g:VerticalPanel>
<g:Label>Inner Object</g:Label>
<g:Label ui:field="innerObjectStringLabel"></g:Label>
</g:VerticalPanel>
<g:VerticalPanel ui:field="listObjectsPanel">
<g:Label>List Objects</g:Label>
</g:VerticalPanel>
<g:Button ui:field="button">Display Test Object</g:Button>
<g:Label ui:field="errorMessageLabel"></g:Label>
</g:VerticalPanel>
</ui:UiBinder>
测试对象
内部对象
列出对象
显示测试对象
感谢您阅读本文,以及您能给我(和其他人)的任何帮助。您需要识别包含要进行GWT编译的源代码的所有包 e、 g
将域类不放在服务器包中可能是更好的选择。我们经常做这样的事情:
<source path="client"/>
<source path="shared"/>
其中shared包含在客户端和服务器之间来回传递的DTO。如果使用DTO,则必须在共享文件夹中插入可传输对象(约定)。如果使用非共享且非“传输”的域对象,则可以在服务器文件夹中插入文件夹(例如“域”),但此“类型”不能用于异步调用。寓意:如果传输的对象必须是“共享”的,否则可以安全地在服务器文件夹中使用 谢谢你,克雷格,现在一切正常。关于使用“共享”包的好技巧。Java RPC中的样板代码数量比Java中的任何东西都让我烦恼。我真的很希望,至少在这种情况下,他们会采用Ruby的约定优先于配置的方法,让您将一个可序列化的对象放到行中。实际上,我已经尝试过这种方法,在到达新VM时调用arrivedAt()方法。它确实很流畅,但arrivedAt方法倾向于将整个客户端和服务器拉入每个构建中。放弃了,但我有这个
<source path="client/test"/>
<source path="server/test"/>
<source path="client"/>
<source path="shared"/>