zoukankan      html  css  js  c++  java
  • 错误/异常:java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType 的解决方法

    1、错误/异常图  

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'baseDao' defined in class path resource [spring/beans_common.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.oa.common.dao.impl.BaseDao]: Constructor threw exception; nested exception is java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

    错误/异常描述:反射类型转换失败(nested exception is java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

    一开始我以为是baseDao注入失败/异常,然后我就仔细检查spring的配置文件(检查了N遍),发现一点问题都没有。后来,经过Debug一步一步调试,发现出错位置:BaseDao()构造器,原代码:

     1     private Class<T> clazz;
     2 
     3     //反射机制,获取对应的对象
     4     @SuppressWarnings("unchecked")
     5     public BaseDao() {//构造函数的作用:获取对应的实体类对象
     6         // this——表示当前类(UserDao)
     7         // this.getClass()——当前运行类的字节码(UserDao.class)
     8         // this.getClass().getGenericSuperclass()——当前运行类的父类(BaseDao<T>,以为User为例,那就是BaseDao<User>)
     9         Type type = this.getClass().getGenericSuperclass(); // generic 泛型
    10         // 强制转化“参数化类型”
    11         ParameterizedType parameterizedType = (ParameterizedType) type;
    12         // 参数化类型中可能有多个泛型参数
    13         Type[] types = parameterizedType.getActualTypeArguments();
    14         // 获取数据的第一个元素(User.class)
    15         clazz = (Class<T>) types[0]; // com.oa.shore.entity.User.class 
    16     }

    说明:我用的是SSH框架(注解版)。JDK-1.8;Tomcat-7.0.96

    我用到的jar包:

        

    2、解决方法    

    加个判断,即可解决:

     1   private Class<T> clazz;
     2 
     3   //反射机制,获取对应的对象
     4   @SuppressWarnings("unchecked")
     5   public BaseDao() {//构造函数的作用:获取对应的实体类对象
     6       // this——表示当前类(UserDao)
     7       // this.getClass()——当前运行类的字节码(UserDao.class)
     8       // this.getClass().getGenericSuperclass()——当前运行类的父类(BaseDao<T>,以为User为例,那就是BaseDao<User>)
     9       Type type = this.getClass().getGenericSuperclass(); // generic 泛型
    10       if(type instanceof ParameterizedType){
    11           // 强制转化“参数化类型”
    12           ParameterizedType parameterizedType = (ParameterizedType) type;
    13           // 参数化类型中可能有多个泛型参数
    14           Type[] types = parameterizedType.getActualTypeArguments();
    15           // 获取数据的第一个元素(User.class)
    16           clazz = (Class<T>) types[0]; // com.oa.shore.entity.User.class 
    17       }
    18   }

    说明:如果你的SessionFactory是“手动”的形式交给spring容器注入,那么,上面的问题还是解决不了;想要解决此问题,得 extends HibernateDaoSupport 它,让spring容器自动去管理/注入,即可解决此问题。可参考以下BaseDao实现类的全部代码

     1 package com.oa.common.dao.impl;
     2 
     3 import java.lang.reflect.ParameterizedType;
     4 import java.lang.reflect.Type;
     5 import java.util.List;
     6 
     7 import org.hibernate.Query;
     8 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
     9 import org.springframework.stereotype.Repository;
    10 
    11 import com.oa.common.dao.IBaseDao;
    12 
    13 /**
    14  * @author DSHORE/2020-2-6
    15  *
    16  */
    17 @Repository("baseDao")
    18 public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T>  {
    19     /* //此处交给spring自动管理/注入了(extends HibernateDaoSupport)
    20     @Autowired
    21     private SessionFactory sessionFactory;
    22      
    23     public void setSessionFactory(SessionFactory sessionFactory) {
    24         this.sessionFactory = sessionFactory;
    25     }*/
    26     
    27     private Class<T> clazz;
    28 
    29     //反射机制,获取对应的对象
    30     @SuppressWarnings("unchecked")
    31     public BaseDao() {//构造函数的作用:获取对应的实体类对象
    32         // this——表示当前类(UserDao)
    33         // this.getClass()——当前运行类的字节码(UserDao.class)
    34         // this.getClass().getGenericSuperclass()——当前运行类的父类(BaseDao<T>,以为User为例,那就是BaseDao<User>)
    35         Type type = this.getClass().getGenericSuperclass(); // generic 泛型
    36         if(type instanceof ParameterizedType){
    37             // 强制转化“参数化类型”
    38             ParameterizedType parameterizedType = (ParameterizedType) type;
    39             // 参数化类型中可能有多个泛型参数
    40             Type[] types = parameterizedType.getActualTypeArguments();
    41             // 获取数据的第一个元素(User.class)
    42             clazz = (Class<T>) types[0]; // com.oa.shore.entity.User.class 
    43         }
    44     }
    45     
    46     @Override //新增
    47     public int add(T entity) {
    48         return (Integer) getHibernateTemplate().save(entity);
    49         //return (Integer) sessionFactory.getCurrentSession().save(entity);
    50     }
    51 
    52     @SuppressWarnings("unchecked")
    53     @Override //查询所有
    54     public List<T> listAll() {
    55         //Query query = sessionFactory.getCurrentSession().createQuery("from " + clazz.getSimpleName());
    56         Query query = getSession().createQuery("from " + clazz.getSimpleName()); //这里用clazz.getName()也行
    57         return query.list();
    58     }
    59 }

    测试结果图:

    此SSH注解版项目的完整代码(可参考):https://www.cnblogs.com/dshore123/p/12336358.html

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:https://www.cnblogs.com/dshore123/p/12331195.html

    版权声明:欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    【Azure 应用服务】在Azure App Service多实例的情况下,如何在应用中通过代码获取到实例名(Instance ID)呢?
    【Azure 应用服务】App Service For Windows 中如何设置代理实现前端静态文件和后端Java Spring Boot Jar包
    【Azure Developer】使用Azure Key Vault 的Key签名后,离线验证的一些参考资料
    【Azure Function】调试 VS Code Javascript Function本地不能运行,报错 Value cannot be null. (Parameter 'provider')问题
    【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(Xms512m Xmx1204m)?
    【Azure API 管理】APIM添加Logtoeventhub的策略后,一些相关APIM与Event Hub的问题
    【Azure API 管理】为调用APIM的请求启用Trace 调试APIM Policy的利器
    【Azure 事件中心】China Azure上是否有Kafka服务简答
    【Azure 应用服务】探索在Azure上设置禁止任何人访问App Service的默认域名(Default URL)
    【Azure 微服务】记一次错误的更新Service Fabric 证书而引发的集群崩溃而只能重建
  • 原文地址:https://www.cnblogs.com/dshore123/p/12331195.html
Copyright © 2011-2022 走看看