java - 持久性实体的 GWT 反序列化 (JPA)

标签 java serialization gwt jpa ejb-3.0

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

让你知道我可能会有所帮助

  • 在我的类路径中包含 EclipseLink-Library(包括 javax.persistence.Entity )
  • 没有从数据库或持久性管理器接收持久性对象 - 我正在使用标准 java 代码创建对象
  • 使用面向 Java EE 开发人员的 Eclipse IDE 进行开发和部署,我正在使用 GWT-Plugin (GWT 2.1.0) 编译我的 GWT 代码 - 我的源代码分为多个项目
  • 我非常确定问题发生在客户端,因为我的服务器的 HTTP 响应在我的工作示例和不工作示例中是相同的
  • 尝试修补 javax.persistence.Entity并尝试包含几个库,其中包括 javax.persistence.Entity但没有任何帮助
  • 仅包含此代码的最小项目可以正常工作,但集成在我们的项目环境中的此代码不起作用

更新:看起来整个主题都存在 rpc.enhancedClasses 的问题。 。我添加了我生成的.gwt.rpc中有趣的内容- 文件。尽管这些 .rpc 文件不同,但通过 HTTP 传输的数据是相同的,这似乎不正常。 这些链接可能很有趣: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 => 一切正常

我正在使用这个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 => 根本不起作用

我正在使用这个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 的提示)。

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

最佳答案

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

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

关于java - 持久性实体的 GWT 反序列化 (JPA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4656327/

相关文章:

java - 什么是 swingset2

c# - 使用 DataContractSerializer 自定义序列化

django - DRF CreateAPIView 中的条件语句

java - gwt 18n 属性文件

iphone - 在 iPhone 上快速测试 GWT 应用程序的解决方法?

java - GWT 持久 URL

java - 如何编写java代码REST Assured代码来获取授权 token ?

java - 线程安全与同步

java - for 循环中的前后增量

java - Java 8 和 Java 11 之间的不同反序列化行为