Это странный случай, я думаю. Конечно, это крайняя проблема, но я точно не знаю, где она, или это проблема с пружиной, проблема с 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, или что-то, что я делаю неправильно, возможно, работает над рефакторингом?
Любые детали, которые проясняют этот беспорядок, будут с благодарностью Это заставило меня ворчать весь день и за то, что казалось таким простым!
Заранее спасибо.