我目前正在开发托管在 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.xml和 the 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/