Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GWT简单RPC用例问题:包含代码_Gwt_Rpc_Gwt Rpc - Fatal编程技术网

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

我正在尝试解决如何使用GWT RPC将域对象从服务器端发送到客户端。我编写了一个非常简单的用例,它代表了我(和其他人?)需要做但目前无法开始工作的事情

我已经浏览了文档、教程和论坛,但它们要么显示传递的字符串,要么提供(当我将它们应用于此时)仍然不起作用的解释

希望有人能向我和其他人解释为什么这个代码不起作用,以及如何让它起作用

多谢各位

以下是错误消息

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"/>