在Struts2 Action类中使用Hibernate获取列名时遭遇NullPointerException
首先咱们拆解下你遇到的两个核心问题:NullPointerException(空指针)和「无法实例化Action」的PersistenceClass<init>异常,结合你试过ModelDriven的情况,一步步来排查:
一、先搞定NullPointerException的根源
你的代码里调用sessionFactory.getClassMetadata(PersistenceClassName.class)后出现空指针,大概率是两个原因:
1. SessionFactory本身没初始化成功
如果sessionFactory是null,那调用它的任何方法都会抛出NPE。你得先确认SessionFactory的初始化逻辑是对的:
- 如果是手动初始化,要确保执行了完整的配置加载和构建流程:
// 正确的手动初始化示例 Configuration hibernateConfig = new Configuration().configure("hibernate.cfg.xml"); SessionFactory sessionFactory = hibernateConfig.buildSessionFactory();
- 如果是用Spring等容器注入,检查配置文件里的SessionFactory bean是否正确定义,并且Action/Service里的
sessionFactory字段有没有加@Autowired或者对应的注入注解,避免注入失败导致null。
2. 实体类没被Hibernate正确映射
如果SessionFactory没问题,但getClassMetadata返回了null,那说明Hibernate没识别到你的PersistenceClassName实体类。这时候要检查:
- 实体类有没有加
@Entity注解(注解方式),或者有没有在hibernate.cfg.xml里配置<mapping class="xxx.PersistenceClassName"/>? - 实体类的包路径有没有被Hibernate扫描到?比如用Spring的话,有没有配置
@EntityScan指定实体类所在包?
建议在调用getPropertyNames前加两层非空判断,快速定位问题:
if (sessionFactory != null) { ClassMetadata classMetadata = sessionFactory.getClassMetadata(PersistenceClassName.class); if (classMetadata != null) { String[] propertyNames = classMetadata.getPropertyNames(); // 处理列名逻辑 } else { System.err.println("Hibernate未映射该实体类,请检查实体类配置"); } } else { System.err.println("SessionFactory未初始化成功"); }
二、解决「无法实例化Action」的PersistenceClass构造器异常
这个异常指向PersistenceClass的构造环节出了问题,和Hibernate、Struts的ModelDriven都有关系:
1. 实体类必须有公共无参构造器
Hibernate要求所有实体类必须提供公共的无参构造器,否则它无法通过反射实例化对象。如果你的PersistenceClass只有带参数的构造器,赶紧加一个无参的:
public class PersistenceClass { // 必须加这个无参构造器 public PersistenceClass() {} // 你的其他带参构造器 public PersistenceClass(String name) { // ... } }
2. 检查ModelDriven的实现是否正确
你说已经实现了ModelDriven接口,但要注意:在Action里必须提前初始化Model实例,不能让它为null。比如:
public class YourAction extends ActionSupport implements ModelDriven<PersistenceClass> { // 这里一定要初始化model,不能只声明不赋值 private PersistenceClass model = new PersistenceClass(); @Override public PersistenceClass getModel() { return model; } // 你的其他Action方法 }
如果model没初始化,Struts在实例化Action时就会因为无法获取Model实例而抛出异常。
3. 排查Action本身的实例化问题
如果上述都没问题,那要检查Action的配置:
- 确认
struts.xml里的Action配置的class属性指向了正确的Action类全路径,有没有拼写错误? - 如果Action里依赖了其他Bean(比如SessionFactory),要确保依赖注入是成功的,不要在Action的构造器里调用依赖的方法——因为构造器执行时依赖可能还没注入,会导致NPE或者实例化失败。
最后总结下排查顺序
- 先验证SessionFactory是否正常初始化,是否为null;
- 检查实体类的映射配置和无参构造器;
- 核对ModelDriven的实现,确保Model实例已初始化;
- 检查Action的配置和依赖注入情况。
按照这个顺序一步步排查,应该能解决你遇到的问题。
内容的提问来源于stack exchange,提问作者Jagruti

