gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:36:38 30 4
gpt4 key购买 nike

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

我可能对你有帮助

  • 在我的类路径中有 EclipseLink-Library(包括 javax.persistence.Entity)
  • 我没有从数据库或持久性管理器接收持久性对象 - 我正在使用标准 Java 代码创建对象
  • 使用面向 Java EE 开发人员的 Eclipse IDE 进行开发和部署,我正在使用 GWT 插件 (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(没有任何注解,或者带有 Entity 以外的任何注解 - 例如 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com