i have genericservice support classes ( genericservice, genericserviceimpl, genericdao,generichibernatedao) generic service,dao layer.
normaly works fine, when extend type parametrized service abstract generic services.when extend extended services in different service gives:
caused by: java.lang.classcastexception: java.lang.class cannot cast java.lang.reflect.parameterizedtype
error.
my generichibernatedao:
@transactional public abstract class generichibernatedaosupport extends hibernatedaosupport implements genericdaotemplate { private class type;
public generichibernatedaosupport() { this.type = (class<t>) ((parameterizedtype) getclass().getgenericsuperclass()).getactualtypearguments()[0]; } @autowired @qualifier(value = "productsessionfactory") public void bindsessionfactory(sessionfactory sessionfactory) { setsessionfactory(sessionfactory); } public class<t> gettype() { return type; } public void settype(class<t> type) { this.type = type; } protected session getcurrentsession() { return gethibernatetemplate().getsessionfactory().getcurrentsession(); } public id persist(t newinstance) { return (id) gethibernatetemplate().save(newinstance); } public void update(t transientobject) { gethibernatetemplate().update(transientobject); } here standart extended hibernatedao class:
@repository public class standadhibernatedao extends standardhibernatedaosupport<standard, long> implements standarddao { above extend operation works fine, when tried this:
@repository public class extendstandardgatewayhibernatedao extends standadhibernatedao implements extendedstandarddao { it throws :
caused by: java.lang.classcastexception: java.lang.class cannot cast java.lang.reflect.parameterizedtype.
do have idea?
to learn value of t you'll need capture in type definition subclassing generichibernatedaosupport:
class mycardao extends generichibernatedaosupport<car> {} you can anonymous class if want:
generichibernatedaosupport<car> mycardao = new generichibernatedaosupport<car>{}(); to resolve value of t, can use typetools:
class<?> cartype = typeresolver.resolverawargument(generichibernatedaosupport.class, mycardao.getclass()); assert cartype == car.class;
Comments
Post a Comment