无法实例化 [org.springframework.orm.hibernate5.LocalSessionFactoryBean]:工厂方法“sessionFactory”抛出异常

吉万嘉瓦利

我在我的项目中实现 hibernate 时遇到问题。我收到错误说

sessionFactory 中的 java.lang.NullPointerException

下面是错误日志和配置文件。请不要建议我使用 xml 类型的配置。

错误日志是:

{"logType":"DEBUG",
 "logLevel":"ERROR",
 "logTimestamp":"2021-09-11T20:28:48.936-05:00",
 "logger":"org.springframework.boot.SpringApplication",
 "label":"Application run failed",
 "runtime": {
   "instance":"unknown",
   "clusterName":"unknown",
   "namespace":"unknown",
   "image":"unknown",
   "platformIdentifier":"AJSC7_JERSEY"},
 "application": {
   "deploymentUnitName":"com.att.dmp.ReorgResourceCreatorMs",
   "motsApplicationAcronym":"MOTS_ID"},
 "exception": {
   "exceptionDetails": 
      "Error creating bean with name 'sessionFactory' defined in
       class path resource [com/att/dmp/DBConfiguration.class]: 
       Bean instantiation via factory method failed; nested 
       exception is: org.springframework.beans.BeanInstantiationException: 
       Failed to instantiate
       [org.springframework.orm.hibernate5.LocalSessionFactoryBean]: 
       Factory method 'sessionFactory' threw exception; 
       nested exception is java.lang.NullPointerException",
   "stackTrace":
     "org.springframework.beans.factory.BeanCreationException: 
      Error creating bean with name 'sessionFactory' defined in 
      class path resource [com/att/dmp/DBConfiguration.class]: 
      Bean instantiation via factory method failed; nested exception is 
     org.springframework.beans.BeanInstantiationException: Failed to instantiate
     [org.springframework.orm.hibernate5.LocalSessionFactoryBean]:
     Factory method 'sessionFactory' threw exception; 
     nested exception is java.lang.NullPointerException
       at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:656)
       at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:484)
       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338)
       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177)
       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
       at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
       at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
       at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
       at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
       at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:860)
       at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)
       at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
       at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
       at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
       at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
       at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
       at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226)
       at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
       at com.att.dmp.Application.main(Application.java:20)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:498)
       at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
   Caused by: org.springframework.beans.BeanInstantiationException:
   Failed to instantiate [org.springframework.orm.hibernate5.LocalSessionFactoryBean]: 
   Factory method 'sessionFactory' threw exception; 
   nested exception is java.lang.NullPointerException
       at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185)
       at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651)
       ... 24 more
   Caused by: java.lang.NullPointerException
       at java.util.Hashtable.get(Hashtable.java:364)
       at org.springframework.core.env.MapPropertySource.getProperty(MapPropertySource.java:42)
       at com.ulisesbocchio.jasyptspringboot.EncryptablePropertySource.getProperty(EncryptablePropertySource.java:13)
       at com.ulisesbocchio.jasyptspringboot.wrapper.EncryptableMapPropertySourceWrapper.getProperty(EncryptableMapPropertySourceWrapper.java:29)
       at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:85)
       at org.springframework.core.env.PropertySourcesPropertyResolver.getProperty(PropertySourcesPropertyResolver.java:62)
       at org.springframework.core.env.AbstractPropertyResolver.getRequiredProperty(AbstractPropertyResolver.java:181)
       at org.springframework.core.env.AbstractEnvironment.getRequiredProperty(AbstractEnvironment.java:556)
       at com.att.dmp.DBConfiguration.sessionFactory(DBConfiguration.java:108)
       at com.att.dmp.DBConfiguration$$EnhancerBySpringCGLIB$$72a5f978.CGLIB$sessionFactory$0(<generated>)
       at com.att.dmp.DBConfiguration$$EnhancerBySpringCGLIB$$72a5f978$$FastClassBySpringCGLIB$$f4df2065.invoke(<generated>)
       at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
       at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)
       at com.att.dmp.DBConfiguration$$EnhancerBySpringCGLIB$$72a5f978.sessionFactory(<generated>)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
       at java.lang.reflect.Method.invoke(Method.java:498)
       at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
       ... 25 more"
   }
}

数据库配置文件



import javax.annotation.Resource;
import javax.sql.DataSource;
import java.util.Properties;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.core.env.Environment;



@Configuration
@PropertySource("classpath:/propertyLoader/InsertQueries.properties")
@PropertySource("classpath:/propertyLoader/SelectQueries.properties")
@PropertySource("classpath:/propertyLoader/UpdateQueries.properties")

public class DBConfiguration {

    private static Logger logger = LogManager.getLogger(DBConfiguration.class);

    @Value("${spring.datasource.jdbcUrl}")
    private String url;

    @Value("${spring.datasource.username}")
    private String userName;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.driver-class-name}")
    private String dbDriverClassName;
    
    @Value("${hibernate.dialect}")
    private String hibernateDialect;
    
    @Value("${hibernate.show_sql}")
    private String hibernateShowSql;
    
    @Value("${hibernate.hbm2ddl.auto}")
    private String hibernateHbm2ddlAuto;
    
    @Value("${entitymanager.packages.to.scan}")
    private String entitymanagerPackagesToScan;
    
      private String PROPERTY_NAME_HIBERNATE_DIALECT = hibernateDialect;
      private String PROPERTY_NAME_HIBERNATE_SHOW_SQL = hibernateShowSql;
      private String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = hibernateHbm2ddlAuto;
      private String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = entitymanagerPackagesToScan;
      
     @Resource
     private Environment env;

    @Bean(name = "dataSource")
    public DataSource dataSource() {

        logger.info("loading configuration : url : {}, userName ; {}, password ;{}", url, userName, password);
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl(url);
        dataSource.setDriverClassName(dbDriverClassName);
        dataSource.setUsername(userName);
        dataSource.setPassword(password);
        dataSource.setRemoveAbandoned(true);
        dataSource.setInitialSize(10);
        dataSource.setMaxActive(30);
        return dataSource;
    }

    @Bean(name = "jdbcOperations")
    public JdbcTemplate jdbcOperations() {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource());
        jdbcTemplate.setFetchSize(500);
        return jdbcTemplate;
    }

    @Bean(name = "jdbcNamedOperations")
    public NamedParameterJdbcTemplate jdbcNamedOperations() {
        NamedParameterJdbcTemplate namedTemplate = new NamedParameterJdbcTemplate(jdbcOperations());
        return namedTemplate;
    }

    
    @Bean (name = "sessionFactory")
    public LocalSessionFactoryBean sessionFactory() {
        LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
        sessionFactoryBean.setDataSource(dataSource());
        sessionFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
        sessionFactoryBean.setHibernateProperties(hibProperties());
        return sessionFactoryBean;
    }
    
    private Properties hibProperties() {
        Properties properties = new Properties();
        properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
        properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
        properties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO));
        return properties;  
    }
    
    @Bean(name = "transactionManager") 
    public HibernateTransactionManager transactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory().getObject());
        return transactionManager;
    }


}

应用程序属性

#Hibernate Configuration:
hibernate.dialect=org.hibernate.dialect.OracleDialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=update
entitymanager.packages.to.scan=com.att.dmp.entity
一个板球运动员

您已将不@Value字段的字段分配给带有的字段,并在代码中使用了这些字段

这些字段中的每一个都是 null 并且不是由 Springboot 注入的

然后,您在 中使用空值env.getRequiredProperty,这会为空查找引发 NPE

解决方案:不要重复字段

Spring 属性可以引用环境变量,所以你不应该在代码中这样做

例如

hibernate.show_sql=§{HIBERNATE_SHOW_SQL:true} 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章