feroult / yawp

Kotlin/Java API framework for Google Appengine
http://yawp.io
MIT License
131 stars 19 forks source link

LazyJson having type argument with type argument problem #81

Closed danilodeLuca closed 8 years ago

danilodeLuca commented 8 years ago

If i have one variable which type argument has type argument too, it throws exception Example:

Variable:

class BasicExample {
    private LazyJson<List<Pojo>> listLazyPojo = new LazyJson<>();
}

Implementation:

Field field = ReflectionUtils.getFieldRecursively(BasicExample.class, "listLazyPojo");
System.out.println((Class<?>)ReflectionUtils.getGenericTypeArgumentAt(field.getGenericType(), 0));

Where it happens: io.yawp.driver.appengine.AppengineQueryDriver.setLazyJsonProperty(Repository, T, Field, Object);

It returns the following exception if i do a GET on this entity:

java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.Class
    at io.yawp.driver.appengine.AppengineQueryDriver.setLazyJsonProperty(AppengineQueryDriver.java:282)
    at io.yawp.driver.appengine.AppengineQueryDriver.setObjectProperty(AppengineQueryDriver.java:237)
    at io.yawp.driver.appengine.AppengineQueryDriver.safeSetObjectProperty(AppengineQueryDriver.java:212)
    at io.yawp.driver.appengine.AppengineQueryDriver.toObject(AppengineQueryDriver.java:204)
    at io.yawp.driver.appengine.AppengineQueryDriver.objects(AppengineQueryDriver.java:71)
    at io.yawp.repository.query.QueryBuilder.executeQuery(QueryBuilder.java:243)
    at io.yawp.repository.query.QueryBuilder.executeQueryFirst(QueryBuilder.java:203)
    at io.yawp.repository.query.QueryBuilder.first(QueryBuilder.java:194)

Workaround created PojoList, which has one List

class PojoList {
    private List<Pojo> listPojo = new ArrayList<>();
}

class BasicExample {
    private LazyJson<PojoList> listLazyPojo = new LazyJson<>();
}
feroult commented 8 years ago

Just released yawp-1.6.3 with the fix.

Now we can have LazyJson of any complex type. For instance:

LazyJson<Map<Long, String>, Map<String, Long>> 

;)

danilodeLuca commented 8 years ago

\,,/