1

ジェネリックとしてgwtrpc接続を介してクラスオブジェクトを渡す必要がありますが、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ソリューションを使用して問題を修正することを確認しましたが、成功しませんでした。さらに、Googleが提案しているように、CustomFieldSerializerを実装しようとしましたが成功しませんでした。

前もって感謝します、

ステファノスアンタリス

PS巨大な投稿でごめんなさい:-)

4

5 に答える 5

2

問題はClass、ネットワークを介してオブジェクトを転送しようとしていることです。なぜそれが開発モードで動作しているのかわかりません(ローカルプロジェクトで試しましたが失敗しました)が、動作しないはずです。名前の代わりにClass、たとえばStringを使用する必要があります。これには、クラスの名前が含まれます。理論的には、のCustomFieldSerializerを作成すれば機能しますがClass、Classの代わりにStringを使用する方が簡単です。

于 2012-09-11T12:53:11.917 に答える
1

永続性アノテーションを持つクラスはサーバー側でうまく機能しますが、そのデータをクライアントに渡したい場合は、サーバーからクライアントにデータを転送するプレーンな Java シリアライズ可能クラスを作成する必要があります。

前の回答で述べたように、永続化アノテーションは同等の JavaScript コードに変換できないため、クライアント側ではサポートされていません (クライアントには永続化の責任がないため、これは理にかなっています)。

于 2012-09-07T19:00:26.933 に答える
0

MySource.javaの永続性関連のアノテーションにより、javascriptへの変換が不可能になる可能性があります。注釈を削除して、関連しているかどうかを確認してください。また、MySource.javaが、モジュールxmlファイル(「source」要素)で翻訳可能として宣言されたパッケージに含まれていることを確認してください。

于 2012-09-07T18:10:11.270 に答える
0

implements Serializableクラスの定義に使用してみてください。私はこのように意味します:

    public class AndroidSource extends MySource implements Serializable{

public AndroidSource() {
    super();
}

}
于 2013-12-30T15:37:05.857 に答える
-1

RPC サービスは、シリアル化可能なオブジェクトのみを処理する必要があります。ドメイン クラスは JavaScript に変換できないため、GWT はそのようなオブジェクトをネットワーク (RPC プロトコル) 経由で送受信できません。java.io.Serializable を実装する DTO クラス (シャドウ ドメイン クラス) を作成し、入力 DTO と出力 DTO で使用するすべての RPC サービスを再構成する必要があります。あなたのプロジェクトに幸運を。

于 2016-01-19T22:11:48.883 に答える