Spring Boot:创建名为“jpaMappingContext”的bean时出错:java.lang.NullPointerException

Posted

技术标签:

【中文标题】Spring Boot:创建名为“jpaMappingContext”的bean时出错:java.lang.NullPointerException【英文标题】:Spring Boot : Error creating bean with name 'jpaMappingContext': java.lang.NullPointerException 【发布时间】:2015-07-28 01:31:19 【问题描述】:

我的组合是 Spring Boot + Spring Data Jpa + 多个数据库。启动应用程序时出现以下 NullPointer 异常。感觉像带有 Boot 的 SPring Data 无法生成 JPA 元数据。我没有得到与此错误相关的任何资源。

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaMappingContext': Invocation of init method failed; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:736)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:957)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:946)
        at com.verient.infinipay.staticcard.Application.main(Application.java:25)
        ... 6 more
Caused by: java.lang.NullPointerException
        at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.getMetamodels(JpaMetamodelMappingContextFactoryBean.java:90)
        at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:56)
        at org.springframework.data.jpa.repository.config.JpaMetamodelMappingContextFactoryBean.createInstance(JpaMetamodelMappingContextFactoryBean.java:26)
        at org.springframework.beans.factory.config.AbstractFactoryBean.afterPropertiesSet(AbstractFactoryBean.java:134)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1633)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1570)
        ... 21 more

我的代码是:

    public EntityManagerFactory apEntityManagerFactory(
            EntityManagerFactoryBuilder builder) 
        return builder
                .dataSource(apDataSource())
                .packages(Entity1.class, Entity2.class)
                .persistenceUnit("ap-persistent-unit")
                .build()
                .getObject();
    

    @Bean
    public EntityManagerFactory trEntityManagerFactory(
            EntityManagerFactoryBuilder builder) 
        return builder
                .dataSource(trDataSource())
                .packages(Entity3.class, Entity4.class)
                .persistenceUnit("tr-persistent-unit")
                .build()
                .getObject();
    

    @Bean
    JpaTransactionManager apTransactionManager(@Qualifier("apEntityManagerFactory") EntityManagerFactory entityManagerFactory) 
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    

    @Bean
    JpaTransactionManager trTransactionManager(@Qualifier("trEntityManagerFactory") EntityManagerFactory entityManagerFactory) 
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    

我在 application.properties 中也有以下休眠属性。

spring.jpa.hibernate.ddl-auto: update
spring.jpa.hibernate.naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.database: H2
spring.jpa.show-sql: true

【问题讨论】:

What is a Null Pointer Exception, and how do I fix it? 的可能重复项 @NathanTuggy :) 我知道 NullPointerException 是什么。在我正在使用的这种框架组合中,什么可能是空的?我缺少任何配置吗?实体中是否存在问题。 【参考方案1】:

Spring boot 默认为类路径上的数据源启用 AutoConfiguration 类。您应该明确排除 AutoConfiguration 类以禁用。

例子:

@EnableAutoConfiguration(exclude = JndiConnectionFactoryAutoConfiguration.class,DataSourceAutoConfiguration.class,
                                    HibernateJpaAutoConfiguration.class,JpaRepositoriesAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class)
@ComponentScan
public class MyBootApplication 
    public static void main(String[] args) 
        SpringApplication.run(MyBootApplication.class, args);
    

【讨论】:

你成就了我的一天..尽管这不是我的实际问题,但通过这个答案,我能够排除所有必需的自动生成类。 :D 谢谢【参考方案2】:

对我来说,这原来是由于我用于将 JSON 类型映射到 Java 对象的 org.hibernate.usertype.UserType 的自定义实现。

在我的特殊情况下,它映射到 java.util.Map 并且这个 change in Spring Data JPA 导致升级到该版本时出现倒退。

解决方法是显式设置 Map 的泛型类型 - 例如Map<String, Object> 就我而言。

【讨论】:

在这里尝试使用 Postgres 将 Map 对象映射到 jsonb,这个答案绝对节省了我的时间,谢谢。【参考方案3】:

非常感谢 Vishal 的想法。在我的例子中,是javax.persistence.AttributeConverter 的无泛型实现引发了这个异常。改变 class MapConverter implements AttributeConverter<Map, String> ... class MapConverter implements AttributeConverter<Map<String, Object>, String> ... 真的很有帮助。

【讨论】:

【参考方案4】:

我在 OnetoOne 关系中遇到了上述问题..

我的应用具有以下 OneToOne 关系。

A ||---|| B

B ||---|| C
Since its OnetoOne, I kept entity B primary key same as entity A, using @MapsId as mentioned here 

https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/

Similarly I kept entity C primary key same as entity B.

我通过改变这样的关系来解决这个问题

A ||---|| B

A ||---|| C

【讨论】:

以上是关于Spring Boot:创建名为“jpaMappingContext”的bean时出错:java.lang.NullPointerException的主要内容,如果未能解决你的问题,请参考以下文章

使用spring security的spring boot:创建名为“securityFilterChainRegistration”的bean时出错

创建名为“dataSource”+ Spring Boot + Hibernate 的 bean 时出错

Spring Boot 1.4 @DataJpaTest - 创建名为“dataSource”的 bean 时出错

Spring Boot:创建名为“jpaMappingContext”的bean时出错:java.lang.NullPointerException

Spring Boot 项目“org.springframework.beans.factory.BeanCreationException:创建名为“entityManagerFactory”的be

没有名为“mongoTemplate”的 bean 可用。 Spring Boot + MongoDB