我试图创建一个由只返回String(名称)和Integer(id)的查询组成的值代理(BrowserDetailItem)。
SERVER代码(不同文件中的每个类)
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 []无法发送到客户端。
我做错了什么?请帮忙
答案 0 :(得分:2)
解决了它。
问题在于:tempList = query.getResultList();
查询返回的结果列表为List<Object[][]>
,无法转换为List<BrowserDetailItem>
。
这意味着返回方法返回List<BrowserDetailItem>
而不是返回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;
这是一个ValueProxy。
解决方案是迭代List并在每次传递中创建一个新的BrowserDetailItem:
{{1}}
我也删除了定位器是没有意义的,因为不需要持久性。
希望它有所帮助。
山姆先生答案 1 :(得分:0)
您的界面必须是EntityProxy而不是ValueProxy
public interface BrowserDetailItemProxy extends EntityProxy{
public String getName();
public Integer getId();
}
使用定位器
https://developers.google.com/web-toolkit/doc/latest/DevGuideRequestFactory#locators
使用定位器进行价值代理
https://groups.google.com/d/msg/google-web-toolkit/J6uhnvH0Wjc/H07hfJWEZbEJ