获取持久实体的反序列化(JPA)

时间:2011-01-11 09:56:17

标签: java serialization gwt jpa ejb-3.0

我目前正在开发托管在weblogic应用服务器上的Java / GWT应用程序。我使用EJB3.0和EclipseLink作为持久层。遗憾的是,我的GWT在反序列化持久性实体方面存在问题。

您知道我可能会有所帮助

  • 在我的类路径中包含EclipseLink-Library(包括javax.persistence.Entity
  • 我没有收到数据库或持久性管理器中的持久性对象 - 我正在使用标准java代码创建对象
  • 使用 Eclipse IDE for Java EE Developers 进行开发和部署,我正在使用GWT-Plugin(GWT 2.1.0)编译我的GWT代码 - 我的源代码分为几个项目< / LI>
  • 我很确定,客户端出现问题,因为我的服务器的HTTP响应在我的工作和我的工作示例中是相同的
  • 尝试修补javax.persistence.Entity,并尝试包含多个包含javax.persistence.Entity的图书馆,但没有任何帮助
  • 只有这个代码的最小项目工作正常,但是这个代码集成在我们的项目环境中不起作用

更新:看起来整个主题与rpc.enhancedClasses存在问题。我添加了生成的.gwt.rpc文件的有趣内容。看起来不正常,通过HTTP传输的数据是相同的,尽管这些.rpc文件不同。 这些链接可能很有趣:RemoteService.gwt.xmlthe documentation for enhances classes

在我的服务器中提供了类SerialClass的实例列表;界面如下所示:

public interface GreetingService extends RemoteService {
    List<SerialClass> greetServer();
}

我的onModuleLoad() - 方法获取这些实例并使用以下信息创建浏览器弹出窗口:

public void onModuleLoad() {
    GreetingServiceAsync server = (GreetingServiceAsync) GWT.create(GreetingService.class);
    server.greetServer(new AsyncCallback<List<SerialClass>>() {
        public void onFailure(Throwable caught) {
        }

        public void onSuccess(List<SerialClass> result) {

            String resultString = "";
            try {
                for (SerialClass serial : result) {
                    if (serial == null) {
                        resultString += "null ";
                    } else {
                        resultString += ">" + serial.id + "< ";
                    }
                }
            } catch (Throwable t) {
                Window.alert("failed to process");
            }

            Window.alert("success:" + resultString);
        }
    });

}

我的服务器看起来像这样:

public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService {
    public List<SerialClass> greetServer() throws IllegalArgumentException {
        List<SerialClass> list = new ArrayList<SerialClass>();
        for (int i = 0; i < 100; i++) {
            list.add(new SerialClass());
        }
        return list;
    }
}

案例1 =&gt;一切正常

我正在使用此SerialClass(没有任何注释,或者除了实体之外的任何注释 - 例如javax.persistence.PersistenceContext正常工作):

//@Entity
public class SerialClass implements Serializable, IsSerializable {
    public int id = 4711;
}

弹出窗口包含(按预期方式):

success:>4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711< >4711<

通过HTTP发送的数据如下所示:

//OK[4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,100,1,["java.util.ArrayList/3821976829","serial.shared.SerialClass/10650133"],0,6]

生成的.xml.rpc - 文件(4F138A4EA095EA4C468507AF3CA19D8F.gwt.rpc)包含:

my.package.SerialClass, true, true, false, false, my.package.SerialClass/2805025871, 2805025871
[Lmy.package.SerialClass;, true, true, false, false, [Lmy.package.SerialClass;/600614154, 600614154

案例2 =&gt;它根本不起作用

我正在使用此SerialClass

@Entity
public class SerialClass implements Serializable, IsSerializable {
    public int id = 4711;
}

我的弹出窗口包含(这是我的问题):

success:>2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null >2< null 

通过HTTP发送的数据看起来像这样(完全相同!):

//OK[4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,4711,2,100,1,["java.util.ArrayList/3821976829","serial.shared.SerialClass/10650133"],0,6]

生成的.xml.rpc - 文件(E81A9E44448F41D2EC63CD508632C10B.gwt.rpc)包含:

my.package.SerialClass, true, true, false, false, my.package.SerialClass/2805025871, 2805025871
@ClientFields,my.package.SerialClass,id
[Lmy.package.SerialClass;, true, true, false, false, [Lmy.package.SerialClass;/600614154, 600614154

没有可疑的日志记录输出 - 既不在服务器上也不在客户端上。所有HTTP响应都返回代码200。

我目前的解决方法

我将尝试创建传输对象作为我的SerialClass的副本 - 这些传输对象看起来完全相同,但不会有@Entity注释。

或者我可以尝试使用RequestFactory(感谢@Hilbrand提示)。

我真的不知道如何解决这个问题,我非常感谢任何建议,提示,提示,链接等。

6 个答案:

答案 0 :(得分:3)

使用GWT RPC,您无法序列化任何包含无法编译为JavaScript的代码的类,并且您建议前进的方法是创建传输对象。

另一种方法是使用GWT 2.1 RequestFactory,另请参阅本文http://blog.ltgt.net/gwt-211-requestfactory。但它在客户端/服务器端与RPC不同,因此您需要重构客户端/服务器端实现,这可能比编写传输对象花费更多时间。

答案 1 :(得分:1)

我已经提到了如何在my blog的GWT层使用JPA 2.0实体。而且,我有一个创建了一个eclipse项目来模拟你的场景。您可以使用this link下载它。我使用过GWT 2.2,如果您的gwt版本低于2.1,那么您还应该为项目添加gwt-java-math

答案 2 :(得分:1)

好的,我们找到了解决方案!感谢所有帮助过我的人!

GWT无法序列化带注释的类的对象,因为.gwt.rpc - 文件无法通过servlet上下文访问。

解决方案是创建包含所有javascript,html和rpc资源的一个war文件。此war文件现在还包含servlet定义(在web.xml中)。我们的java代码部署在单独的模块(jar文件)中,由war文件引用。

答案 3 :(得分:0)

一轮工作:

您需要提供由GWT编译器编译的已使用注释的来源。

只需创建特殊的源目录,该目录仅用于GWT编译,并在那里复制注释的来源。

答案 4 :(得分:0)

无需创建值对象的副本。我之前遇到过这样的问题。我上传了一个application骨架来帮助您入门(减去图书馆)。如果你不能使用SVN,请告诉我。

答案 5 :(得分:0)

我处理这个问题的方法是创建DTO或值对象。 GWT需要客户端的源文件。我认为没有办法解决它。