Проблема с аннотацией EntityScan Spring. Перестает работать при переносе классов моделей в новый пакет - PullRequest
0 голосов
/ 05 февраля 2020

Это странный случай, я думаю. Конечно, это крайняя проблема, но я точно не знаю, где она, или это проблема с пружиной, проблема с IntelliJ или даже проблема с пользователем.

Вот история:

У меня есть Приложение Spring Boot, которое использует данные Spring и прекрасно работает.

При работе с этой конфигурацией она прекрасно работает на IntelliJ:

@EntityScan(basePackages = {"com.legosoft.disperser.event.model"})
@SpringBootApplication(scanBasePackages = {"com.legosoft.disperser.event.bean"})
@EnableJpaRepositories(basePackages = "com.legosoft.disperser.event.bean.repositories")

Одно из используемых мной репозиториев, и снова, с вышеуказанной конфигурацией все в порядке:

package com.legosoft.disperser.event.bean.repositories;

import com.legosoft.disperser.event.model.FileConfiguration;
import com.legosoft.disperser.event.model.FileConfigurationId;
import org.springframework.data.jpa.repository.JpaRepository;


public interface FileConfigurationDao extends JpaRepository<FileConfiguration, FileConfigurationId> {
}

Нам нужно было переименовать некоторые элементы приложения, среди прочего, пакеты и модули. Итак, сегодня я вхожу в офис, думая, что это будет не более пары часов работы, и что только потому, что нужно написать много документации, думая, что опция рефактора -> переименования в IDE действительно сделает для меня тяжелую работу .

Итак, я переименовал пакет модели, используя вышеупомянутую опцию, в

com.legosoft.fileengine.core.model

, что оставило мою конфигурацию приложения примерно такой:

@EntityScan(basePackages = {"com.legosoft.fileengine.core.model"})
@SpringBootApplication(scanBasePackages = {"com.legosoft.disperser.event.bean"})
@EnableJpaRepositories(basePackages = "com.legosoft.disperser.event.bean.repositories")

и ранее показанный хранилище соответственно изменило свой импорт:

package com.legosoft.disperser.event.bean.repositories;

import com.legosoft.fileengine.core.model.FileConfiguration;
import com.legosoft.fileengine.core.model.FileConfigurationId;
import org.springframework.data.jpa.repository.JpaRepository;


public interface FileConfigurationDao extends JpaRepository<FileConfiguration, FileConfigurationId> {
}

На первый взгляд, все было в порядке, это было просто изменение пакета. Все скомпилировалось нормально, но при попытке запустить приложение я получил:

Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.legosoft.fileengine.core.model.FileConfiguration
    at org.hibernate.metamodel.internal.MetamodelImpl.managedType(MetamodelImpl.java:552)
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:74)
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:66)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:201)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:151)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:134)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:65)
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:305)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:297)
    at org.springframework.data.util.Lazy.getNullable(Lazy.java:211)
    at org.springframework.data.util.Lazy.get(Lazy.java:94)
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:300)
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:121)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1837)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
    ... 42 common frames omitted

Теперь вот часть, которую я не понимаю. Отладка в зависимостях Я нашел этот фрагмент кода, который создает исключение в классе org.hibernate.metamodel.internal.JpaMetamodelEntityInformation:

public <X> ManagedType<X> managedType(Class<X> cls) {
        ManagedType<?> type = (ManagedType)this.jpaEntityTypeMap.get(cls);
        if (type == null) {
            type = (ManagedType)this.jpaMappedSuperclassTypeMap.get(cls);
        }

        if (type == null) {
            type = (ManagedType)this.jpaEmbeddableTypeMap.get(cls);
        }

        if (type == null) {
            throw new IllegalArgumentException("Not a managed type: " + cls);
        } else {
            return type;
        }

Где из своей отладки я определил, что класс ищет является правильным (он получает объект класса в своем новом пакете), но кажется, что сканирование сущностей перестает работать, потому что все карты, используемые для поиска класса в модели сущностей, пусты (jpaEntityTypeMap, jpaMappedSuperclassTypeMap или jpaEmbeddableTypeMap) и буквально единственная вещь, которая изменилась заключается в том, что классы изменили пакет.

Теперь я не знаю, является ли это проблемой, присущей опции refactor-> rename в IntelliJ, поскольку нет ничего явно неправильного (проект компилируется, ссылки правильно обновлено), но, очевидно, что-то странное произошло из-за того, что в действительности не выполняется сканирование, или, возможно, я неправильно использую этот инструмент, или, возможно, на самом деле что-то я неправильно сделал в Spring.

Я знаю, что проблема в продукте этого рефактора, потому что, как только я возвращаюсь к нему, проект снова начинает работать нормально, репозитории и все. Кто-нибудь знает, если проблема в IntelliJ, что-то, чего я еще не видел со стороны Spring, или что-то, что я делаю неправильно, возможно, работает над рефакторингом?

Любые детали, которые проясняют этот беспорядок, будут с благодарностью Это заставило меня ворчать весь день и за то, что казалось таким простым!

Заранее спасибо.

1 Ответ

1 голос
/ 05 февраля 2020

Нашел проблему. Даже если вы отметите «Рефакторинг всех мест» в диалоге рефакторинга -> переименовать, имя пакета в entitymanager.packagesToScan в application.properties не изменилось.

Поскольку путь к пакету в аннотации в классе приложения config Менялось, мне никогда не приходило в голову проверить файл свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...