我需要通过gwt rpc连接传递一个类对象作为通用,但似乎rpc不与它配合。该类使用java.io.Serializable进行序列化。我已经使用gwt IsSerializable检查了它,但我仍然有错误。
这是我的代码
MySource.java
@SuppressWarnings("serial")
@PersistenceCapable
@Inheritance(strategy = InheritanceStrategy.SUBCLASS_TABLE)
public abstract class MySource implements Serializable {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String userId;
@Persistent
private String title;
@Persistent
private String description;
@Persistent
private String blobKey;
@Persistent
private String youtubeLink;
@Persistent
private String personalLink;
@Persistent
private Date submitedDate;
@Persistent
private float price;
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getBlobKey() {
return blobKey;
}
public void setBlobKey(String blobKey) {
this.blobKey = blobKey;
}
public String getYoutubeLink() {
return youtubeLink;
}
public void setYoutubeLink(String youtubeLink) {
this.youtubeLink = youtubeLink;
}
public String getPersonalLink() {
return personalLink;
}
public void setPersonalLink(String personalLink) {
this.personalLink = personalLink;
}
public Date getSubmitedDate() {
return submitedDate;
}
public void setSubmitedDate(Date submitedDate) {
this.submitedDate = submitedDate;
}
public Long getId() {
return id;
}
}
AndroidSource.java
@SuppressWarnings("serial")
@PersistenceCapable
public class AndroidSource extends MySource{
public AndroidSource() {
super();
}
}
CategoryBrowseService.java,它是远程服务模型
@RemoteServiceRelativePath("categoryService")
public interface CategoryBrowseService extends RemoteService{
ArrayList<MySource> getSourceList(Class<? extends MySource> classType);
}
CategoryBrowseServiceAsync.java 公共接口CategoryBrowseServiceAsync {
void getSourceList(Class<? extends MySource> classType,
AsyncCallback<ArrayList<MySource>> callback);
}
在其中调用rpc的CategoryBrowsePresenter.java
private void retrieveSources(Class<? extends MySource> classType) {
CategoryBrowseServiceAsync rpcService = GWT.create(CategoryBrowseService.class);
rpcService.getSourceList(classType, new AsyncCallback<ArrayList<MySource>>() {
@Override
public void onFailure(Throwable caught) {
Window.alert("Ooops!!!Sorry!Something went wrong.I am still beta!");
}
@Override
public void onSuccess(ArrayList<MySource> result) {
sourceList = result;
display.setSourceContent(sourceList);
}
});
}
CategoryBrowseServiceImpl.java
@SuppressWarnings("serial")
public class CategoryBrowseServiceImpl extends RemoteServiceServlet implements CategoryBrowseService{
private SourceDatastore dataStore;
public CategoryBrowseServiceImpl() {
dataStore = new SourceDatastore();
}
@Override
public ArrayList<MySource> getSourceList(Class<? extends MySource> classType) {
return dataStore.getSources(classType);
}
}
这是我得到的错误。
Compiling module com.sourcebay.SourceBay
Scanning for additional dependencies: file:/home/santaris/workspace/SourceBay/src/com/sourcebay/client/presenter/mybay/browse/CategoryBrowsePresenter.java
Computing all possible rebind results for 'com.sourcebay.client.model.mybay.browse.CategoryBrowseService'
Rebinding com.sourcebay.client.model.mybay.browse.CategoryBrowseService
Invoking generator com.google.gwt.user.rebind.rpc.ServiceInterfaceProxyGenerator
Generating client proxy for remote service interface 'com.sourcebay.client.model.mybay.browse.CategoryBrowseService'
[ERROR] java.lang.Class<T> is not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' or 'java.io.Serializable' nor does it have a custom field serializer (reached via java.lang.Class<? extends com.sourcebay.shared.source.MySource>)
[ERROR] java.lang.Class<T> has no available instantiable subtypes. (reached via java.lang.Class<? extends com.sourcebay.shared.source.MySource>)
[ERROR] subtype java.lang.Class<T> is not assignable to 'com.google.gwt.user.client.rpc.IsSerializable' or 'java.io.Serializable' nor does it have a custom field serializer (reached via java.lang.Class<? extends com.sourcebay.shared.source.MySource>)
[ERROR] Errors in 'file:/home/santaris/workspace/SourceBay/src/com/sourcebay/client/presenter/mybay/browse/CategoryBrowsePresenter.java'
[ERROR] Line 75: Failed to resolve 'com.sourcebay.client.model.mybay.browse.CategoryBrowseService' via deferred binding
悖论是,当我通过eclipse插件运行我的应用程序时,一切正常。有人可以帮帮我吗?我已经检查过通过DTO解决方案解决问题而没有任何成功。此外,我试图实现一个CustomFieldSerializer,正如谷歌建议的那样,没有任何成功。
提前致谢,
Stefanos Antaris
P.S。抱歉这篇巨大的帖子: - )
答案 0 :(得分:2)
问题是您尝试通过网络传输Class
对象。我不知道为什么它在开发模式下工作(我在本地项目上尝试过但它失败了),但它应该不起作用。您必须使用其他名称而不是Class
名称,例如String,它将包含类的名称。从理论上讲,如果为Class
创建CustomFieldSerializer,它可以工作,但使用String而不是Class会更容易。
答案 1 :(得分:1)
具有持久性注释的类在服务器端可以很好地工作,但是如果要将其数据传递给客户端,则必须创建一个普通的java可序列化类来将数据从服务器传输到客户端。
如前面的回答所述,客户端不支持持久性注释,因为它们无法转换为等效的javascript代码(因为客户端没有持久性的责任,所以它是有意义的。)
答案 2 :(得分:0)
可能是MySource.java中与持久性相关的注释使得转换为javascript变得不可能。尝试删除注释以查看它是否相关。还要确保MySource.java位于模块xml文件(“source”元素)中声明为可翻译的包中。
答案 3 :(得分:0)
尝试使用implements Serializable
来定义您的课程。
我的意思是这样的:
public class AndroidSource extends MySource implements Serializable{
public AndroidSource() {
super();
}
}
答案 4 :(得分:-1)
您的RPC服务必须只处理Serializable对象。域类不能翻译成JavaScript,因此GWT无法通过网络(RPC Protocole)发送和接收此类对象。您需要创建实现java.io.Serializable的DTO类(具有阴影域类),然后重新配置所有RPC服务以在输入DTO和输出DTO中使用。祝你的项目好运。