0

String(name)とInteger(id)のみを返すクエリで構成される値プロキシ(BrowserDetailItem)を作成しようとしています。

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

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;
    }

}

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

@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()が返されるまでコードが実行され(クエリが返され、結果がリストに割り当てられます)、次のエラーが発生します。

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

私は何が間違っているのですか?助けてください

4

2 に答える 2

2

解決しました。

問題は次のとおりです。tempList=query.getResultList();

クエリから返された結果リストは、List<Object[][]>に変換できませんでしたList<BrowserDetailItem>

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

解決策は、リストを反復処理し、各パスで新しい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 "); 

        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;

また、永続性が必要ないため、ロケーターを削除しても意味がありませんでした。

それが役に立てば幸い。

Thxサム

于 2012-05-15T20:28:53.473 に答える
0

インターフェイスはValueProxyではなくEntityProxyである必要があります

public interface BrowserDetailItemProxy extends EntityProxy{

    public String getName();

    public Integer getId();

}

ロケーターの使用

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

Value-Proxyのロケーターの使用

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

于 2012-05-08T05:01:49.327 に答える