GWT ValueProxy and RequestFactory Domain Type error

237 views
Skip to first unread message

jmbz84

unread,
May 7, 2012, 3:49:32 PM5/7/12
to Google Web Toolkit
Hello,

Im trying to create a Value Proxy (BrowserDetailItem ) that is formed
of a query that only returns a String(name) and a Integer(id).

The SERVER code (each class in a different files)

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

}


The SHARED code (each class in a different files)

@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();
}

I did all the wiring acording to the developer guide and
http://cleancodematters.com/2011/06/04/tutorial-gwt-request-factory-part-i/

The code executes (returns the query and assigns the results to a
list) up to the return of getBrowserFilterList() then I get the
following error:

com.google.web.bindery.requestfactory.server.UnexpectedException: The
domain type java.lang.Object[] cannot be sent to the client.

What am I doing wrong? please help

Brandon Donnelson

unread,
May 8, 2012, 4:17:59 PM5/8/12
to google-we...@googlegroups.com
Have you tried setting your @ProxyFor(BrowserDetailItem.class)? I haven't configured my proxies 

This is how I'd do it. 

For the client side
@ProxyFor(BrowserDetailItem.class)) 

public interface BrowserDetailItemProxy extends ValueProxy { 
   public String getName();  
   public Integer getId(); 
}

For the server side, in any package on server side...
public class BrowserDetailItem {
   public String getName() {
     return name;
   }
   public Integer getId() {
     return id;
   }
   //.. and some setters for server side use probabl...
}

Thats how I configure my ValueProxies. 

Hope that helps,
Brandon Donnelson


Brandon Donnelson

unread,
May 8, 2012, 4:18:28 PM5/8/12
to google-we...@googlegroups.com
Have you tried setting your @ProxyFor(BrowserDetailItem.class)? I haven't configured my proxies 

This is how I'd do it. 

For the client side
@ProxyFor(BrowserDetailItem.class)) 

public interface BrowserDetailItemProxy extends ValueProxy { 
   public String getName();  
   public Integer getId(); 
}

For the server side, in any package on server side...
public class BrowserDetailItem {
   public String getName() {
     return name;
   }
   public Integer getId() {

jmbz84

unread,
May 9, 2012, 12:55:25 PM5/9/12
to Google Web Toolkit
Yes I have already declared the ProxyFor

@ProxyFor(value = BrowserDetailItem.class, locator =
BrowserDetailItemLocator.class)

On 8 mayo, 15:18, Brandon Donnelson <branflake2...@gmail.com> wrote:
> Have you tried setting your @ProxyFor(BrowserDetailItem.class)? I haven't
> configured my proxies
>
> This is how I'd do it.
>
> *For the client side*
> @ProxyFor(BrowserDetailItem.class))
> public interface BrowserDetailItemProxy extends ValueProxy {
>    public String getName();
>    public Integer getId();
>
> }
>
> *For the server side, in any package on server side...*

Brandon Donnelson

unread,
May 9, 2012, 8:15:10 PM5/9/12
to google-we...@googlegroups.com
Have you tried it with out the locator annotation like I noted in my example?

jmbz84

unread,
May 15, 2012, 4:23:43 PM5/15/12
to Google Web Toolkit
Solved it.

The problem was in: tempList = query.getResultList();

The result list returned from the query is a List<Object[][]> which
couldn't be converted to List<BrowserDetailItem>.

This meant that the return method instead of returning a
List<BrowserDetailItem> which is a ValueProxy, returned a List<Object[]
[]> which can't be sent to the server.

The solution was to iterate though the List<Object[][]> and create a
new BrowserDetailItem in each pass:

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;

Hope it helps.

kjordan

unread,
May 16, 2012, 9:51:25 AM5/16/12
to google-we...@googlegroups.com
Your other option is to do a "new BrowserDetailItem(s.name, s.id)" in your query string.
Reply all
Reply to author
Forward
0 new messages