将GraniteDS与Java客户端一起使用

将GraniteDS与Java客户端一起使用,java,spring,hibernate,jakarta-ee,graniteds,Java,Spring,Hibernate,Jakarta Ee,Graniteds,是否有人成功地将GraniteDS与普通Java客户机和延迟加载(真正的Java客户机或Java服务器应用程序调用另一台服务器)结合使用 是否需要任何特殊的客户端初始化?(文档对此只字未提,因此我们假设不需要,只需使用示例代码) 在文档(3.0.M2)的基础上,我们创建了一个Spring后端和一个Java客户机,它适用于简单的POJO,但在需要返回Hibernate加载的POJO时失败(RemoteService和Tide版本都出现了相同的反序列化异常) 目前,我们没有客户端配置文件,只有以下代

是否有人成功地将GraniteDS与普通Java客户机和延迟加载(真正的Java客户机或Java服务器应用程序调用另一台服务器)结合使用

是否需要任何特殊的客户端初始化?(文档对此只字未提,因此我们假设不需要,只需使用示例代码)

在文档(3.0.M2)的基础上,我们创建了一个Spring后端和一个Java客户机,它适用于简单的POJO,但在需要返回Hibernate加载的POJO时失败(RemoteService和Tide版本都出现了相同的反序列化异常)

目前,我们没有客户端配置文件,只有以下代码:

String baseURL = "http://localhost:8080/WebApp_Development_Client_Maven/"; URI uri = new URI(baseURL + "graniteamf/amf.txt"); Transport tr = new ApacheAsyncTransport(); tr.start(); AMFRemotingChannel ch = new AMFRemotingChannel(tr, "graniteamf", uri); RemoteService srv = new RemoteService(ch, "userService"); List users = (List)srv.newInvocation("listUsers").invoke().get().getData(); 字符串baseURL=”http://localhost:8080/WebApp_Development_Client_Maven/"; URI=新的URI(baseURL+“graniteamf/amf.txt”); Transport tr=新的ApacheAxyncTransport(); tr.start(); AMFRemotingChannel ch=新的AMFRemotingChannel(tr,“graniteamf”,uri); RemoteService srv=新的RemoteService(ch,“用户服务”); 列表用户=(列表)srv.newInvocation(“listUsers”).invoke().get().getData(); 反序列化异常:

Caused by: java.lang.RuntimeException: The ActionScript3 class bound to limes.core.model.security.User (ie: [RemoteClass(alias="limes.core.model.security.User")]) implements flash.utils.IExternalizable but this Java class neither implements java.io.Externalizable nor is in the scope of a configured externalizer (please fix your granite-config.xml) at org.granite.messaging.amf.io.AMF3Deserializer.readAMF3Object(AMF3Deserializer.java:500) at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:130) at org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:92) ... 36 more 原因:java.lang.RuntimeException:绑定到limes.core.model.security.User的ActionScript3类(即:[RemoteClass(alias=“limes.core.model.security.User”)]实现了flash.utils.IExternalizable,但该java类既不实现java.io.Externalizable,也不在已配置的外部化器的范围内(请修复granite config.xml) 位于org.granite.messaging.amf.io.AMF3Deserializer.readAMF3Object(AMF3Deserializer.java:500) 位于org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:130) 位于org.granite.messaging.amf.io.AMF3Deserializer.readObject(AMF3Deserializer.java:92) ... 36多 背景:

我们有一个客户机服务器Java/Swing应用程序,它最初是为内部网设计的(利用Hibernate 3作为ORM)。它也可以通过互联网工作,但PostgreSQL数据库连接经常中断,这使得客户端不可靠(由于数据库连接丢失/中断而随机冻结)。这似乎不可能正确解决(手动重新连接等简单措施已经实施)

我们需要在互联网上部署应用程序,由于复杂的逻辑已经重构为服务类,我们希望大部分GUI保持不变,并远程服务类。我们正在将持久层和服务类迁移到Spring后端,并希望使用GraniteDS,因为应用程序中大量使用了透明的延迟加载,因此很难用DTO用法和/或初始值设定项替换它


我没有找到普通Java客户机示例,只有一个JavaFX示例应用程序,它与JavaFX紧密相连,似乎很难转换为普通Java客户机(即使在Linux上尝试它也有点问题,因为它没有包含Webstart配置)。

在这个版本的GraniteDS中,延迟加载似乎不起作用(3.0.0.M2)使用普通Java客户端

理论上,它可以在JavaFX环境中工作,但它的实现方式是普通Java客户端无法使用透明的延迟加载

此外,GraniteDS不支持对单个实体的延迟加载,只支持集合,这使得它不适合使用这种关系的项目。我个人认为这是一个明显的遗漏,特别是因为他们经常将其延迟加载支持称为“完全”


不幸的是,文档没有说明延迟加载限制,也没有区分GraniteDS与JavaFX和普通Java的功能。

反序列化异常已经解决,它是由于在客户端的类路径中使用Hibernate3而不是Hibernate4和GraniteDS造成的正在执行异常的真正关闭。在对GraniteDS客户端进行一些调试后,找到了真正的原因,并纠正了问题。我没有提出问题,因为延迟加载尚未工作,可能需要一些配置。