2012-05-07 10 views
0

文字列(名前)と整数(ID)のみを返すクエリで構成された値プロキシ(BrowserDetailItem)を作成しようとしています。GWT ValueProxyおよびRequestFactoryドメインタイプのエラー

サーバ・コード(異なるファイル内の各クラス)

public class BrowserDetailItem { 

    private String name; 
    private Integer id; 

    public static EntityManager entityManager() { 
     return (new UnitPersistence()).get(); 
    } 

    BrowserDetailItem() { 
    } 

    BrowserDetailItem(String name, Integer id) { 
     this.name = name; 
     this.id = id; 
    } 

    public String getName() { 

     if (name == null) 
      return ""; 
     else 
      return name; 
    } 

    public Integer getId() { 

     if (id == null) 
      return null; 
     else 
      return id; 
    } 

    public static List<BrowserDetailItem> getBrowserFilterList() { 

     EntityManager entityManager = entityManager(); 
     try { 

      List<BrowserDetailItem> tempList = new ArrayList<BrowserDetailItem>(); 

      Query query = entityManager 
        .createQuery("SELECT s.name,s.id FROM Song s, Playlist p, Composer c " 
          + "WHERE s.id_playlist = p.id AND c.id = p.id_composer "); 

      tempList = query.getResultList(); 
      tempList.size(); 

      return tempList; 

     } catch (Exception e) { 
      return null; 
     } finally { 
      entityManager.close(); 
     } 

    } 
} 
public class BrowserDetailItemDAO { 

    public void save(BrowserDetailItem browserItem) { 
    } 

    public BrowserDetailItem findById(Integer id) { 
     return null; 
    } 
} 



public class BrowserDetailItemLocator extends 
     Locator<BrowserDetailItem, Integer> { 

    @Override 
    public BrowserDetailItem create(Class<? extends BrowserDetailItem> clazz) { 
     return new BrowserDetailItem(); 
    } 

    @Override 
    public BrowserDetailItem find(Class<? extends BrowserDetailItem> clazz, 
      Integer id) { 
     return getBrowserDetailItemDao().findById(id); 
    } 

    private BrowserDetailItemDAO getBrowserDetailItemDao() { 
     return new BrowserDetailItemDAO(); 
    } 

    @Override 
    public Class<BrowserDetailItem> getDomainType() { 
     return BrowserDetailItem.class; 
    } 

    @Override 
    public Integer getId(BrowserDetailItem domainObject) { 
     return domainObject.getId(); 
    } 

    @Override 
    public Class<Integer> getIdType() { 
     return Integer.class; 
    } 

    @Override 
    public Object getVersion(BrowserDetailItem domainObject) { 
     // return domainObject.getVersion(); 
     return null; 
    } 

} 

Iは全ての配線は、開発者ガイドた内容に応じた共有コード(異なるファイル内の各クラス)

@ProxyFor(value = BrowserDetailItem.class, locator = BrowserDetailItemLocator.class) 
public interface BrowserDetailItemProxy extends ValueProxy { 

    public String getName(); 

    public Integer getId(); 

} 

@Service(BrowserDetailItem.class) 
public interface BrowserDetailItemRequest extends RequestContext { 

    Request<List<BrowserDetailItemProxy>> getBrowserFilterList(); 
} 

そしてhttp://cleancodematters.com/2011/06/04/tutorial-gwt-request-factory-part-i/

getBrowserFilterList()の戻りまでコードが実行され(クエリを返して結果をリストに代入する)、次のエラーが発生しますr:

com.google.web.bindery.requestfactory.server.UnexpectedException:ドメインタイプjava.lang.Object []をクライアントに送信できません。

私は間違っていますか?

答えて

2

のロケータの使用の使用でなければなりません助けてください解決済み それ。

問題がでました:結果リストは、クエリから返さtempList = query.getResultList();

List<BrowserDetailItem>に変換することができませんでしたList<Object[][]>です。

これは、ValueProxyであるList<BrowserDetailItem>を返す代わりにreturnメソッドがList<Object[][]>を返し、サーバーに送信できないことを意味していました。

 Query query = entityManager 
      .createQuery("SELECT s.name,s.id FROM Song s, Playlist p, Composer c WHERE s.id_playlist = p.id AND c.id = p.id_composer "); 

     List results = query.getResultList(); // Fetches list containing arrays of object 

     Iterator it = results.iterator(); 

     while (it.hasNext()) { 

      Object[] result = (Object[]) it.next(); // Iterating through the array object 

      tempList.add(new BrowserDetailItem ((String) result[0], (Integer) result[1])); 
     } 

     tempList.size(); 

     return tempList; 

が、私はまた何の持続性が必要とされなかったため、ロケータは無意味だった削除:

ソリューションは、リストものの反復処理し、各パスで新しいBrowserDetailItemを作成することでした。

希望します。あなたの応答のための

Thxをサム

0

あなたインタフェースはEntityProxy代わりのValueProxy

public interface BrowserDetailItemProxy extends EntityProxy{ 

    public String getName(); 

    public Integer getId(); 

} 

ロケータ

https://developers.google.com/web-toolkit/doc/latest/DevGuideRequestFactory#locators

ValueProxy

https://groups.google.com/d/msg/google-web-toolkit/J6uhnvH0Wjc/H07hfJWEZbEJ

+0

サムのおかげで、私はEntityProxyにValueProxyを変えたが、私はまだ同じエラーメッセージを取得しています。 com.google.web.bindery.requestfactory.server.UnexpectedException:ドメインタイプjava.lang.Object []をクライアントに送信できません 他の提案はありますか? – jmbz

+0

あなたはコード全体をアップロードできますか?私はそれをテストするつもりです。私にメールで送ってください。[email protected] – Sam

関連する問題