我目前正在开发托管在weblogic应用服务器上的Java / GWT应用程序。我使用EJB3.0和EclipseLink作为持久层。遗憾的是,我的GWT在反序列化持久性实体方面存在问题。
您知道我可能会有所帮助
javax.persistence.Entity
)javax.persistence.Entity
,并尝试包含多个包含javax.persistence.Entity
的图书馆,但没有任何帮助 更新:看起来整个主题与rpc.enhancedClasses
存在问题。我添加了生成的.gwt.rpc
文件的有趣内容。看起来不正常,通过HTTP传输的数据是相同的,尽管这些.rpc文件不同。
这些链接可能很有趣: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 =&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提示)。
我真的不知道如何解决这个问题,我非常感谢任何建议,提示,提示,链接等。
答案 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需要客户端的源文件。我认为没有办法解决它。