it-roy-ru.com

Spring Boot: Ошибка создания компонента с именем jpaMappingContext: Java.lang.NullPointerException

Моя комбинация это Spring Boot + Spring Data Jpa + несколько баз данных. Я получаю следующее исключение NullPointer при запуске приложения. Похоже, что SPring Data с Boot не может генерировать метаданные 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

11
Sudhirkd

При загрузке Spring классы автоконфигурации включены по умолчанию для источников данных, уже находящихся в classpath. Вы должны явно исключить класс 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);
    }
}
14
wallance

Для меня это произошло из-за пользовательской реализации org.hibernate.usertype.UserType, которую я использовал для отображения типов JSON на объекты Java. 

В моем конкретном случае это было сопоставление с Java.util.Map, и это изменение в Spring Data JPA вызывало регресс при обновлении до этой версии.

Исправление было в том, чтобы явно установить универсальные типы для карты - например, Map<String, Object> в моем случае.

3
Vishal

Большое спасибо Вишалу за идею. В моем случае это была исключительная реализация javax.persistence.AttributeConverter, которая спровоцировала это исключение. Изменение class MapConverter implements AttributeConverter<Map, String> { ... } на class MapConverter implements AttributeConverter<Map<String, Object>, String> { ... } действительно помогло.

0
IhorP