使用部署在GlassFish中并使用Eclipse Helios J2EE的GWT(2.0)+ EJB(3.x)+ JPA来真正具体。
我的EJB项目中有两个实体:Client和Provider实体。使用RPC我从GWT调用EJB项目,重新启动一些实体并将它们发送回GWT项目。电话是这样的:
GWT从EJB调用findClient,使用EntityManager查找客户端实体并将其返回给GWT。然而,当我尝试编译我的GWT项目时,我得到以下
Compiling module com.MYPROJECT
Validating newly compiled units
[ERROR] Errors in 'file:/.....****....../GreetingService.java'
[ERROR] Line 20: No source code is available for type com.MYPROJECT.entities.Client; did you forget to inherit a required module?
[ERROR] Line 26: No source code is available for type com.MYPROJECT.entities.Provider; did you forget to inherit a required module?
[ERROR] Errors in 'file:/C:/workspaces/...***.../GreetingServiceAsync.java'
[ERROR] Line 14: No source code is available for type com.MYPROJECT.entities.Client; did you forget to inherit a required module?
[ERROR] Line 16: No source code is available for type com.MYPROJECT.entities.Provider; did you forget to inherit a required module?
答案 0 :(得分:2)
错误信息说明了一切,即使您可能没有意识到这一点(我遇到了同样的问题)。 GWT将Java代码编译成JavaScript代码,并且需要源代码。您可能包含了另一个库中提到的实体,因此这些实体的源代码不可用,因此GWT无法完成它的工作。
您(不幸的是)需要做的是创建一个单独的对象(在您的项目中)并将数据从您的实体移动(即移动)到这个新对象。
您必须确保以正确的方式移动数据,例如以下内容:
static copyDataToGwtObject(MyObj obj) {
MyGwtObject gwtObj = new MyGwtObject();
gwtObj.setValueA(obj.getValueA());
gwtObj.setValueB(obj.getValueB());
}
(遗憾的是)不能工作的是在MyGwtObject的构造函数中移动数据:-(即不要执行以下操作:
class MyGwtObject {
private String valueA;
private String valueB;
public MyGwtObject(MyObj obj) {
this.valueA = obj.getValueA();
this.valueB = obj.getValueB();
}
}
这不起作用,因为GWT(再次)需要构造函数的源代码。
答案 1 :(得分:0)
您的GreetingService
是RemoteService
吗?我用来“转换”服务器返回的对象到我在客户端项目中创建的等效对象:
在GreetingSerciceImpl
(扩展RemoteServiceServlet
)中,我会写:
public TestClient someMethod() {
Client c = ejbClass.getClient() // returns object of Client class defined in the EJB project
return translate(c);
}
private TestClient translate(Client c) {
TestClient tc = new TestClient();
tc.setName(c.getName());
return tc;
}
在GWT项目的客户端代码中的某处定义了TestClient
。
HTH