Пользовательский стартер весенней загрузки, определите в нем объекты без использования @EntityScan. Является ли это возмJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Пользовательский стартер весенней загрузки, определите в нем объекты без использования @EntityScan. Является ли это возм

Сообщение Anonymous »


Я провожу несколько тестов, используя специальные стартеры для весенней загрузки. Мне удалось настроить все, кроме сущностей. Я пробовал использовать @Import для загрузки объектов в класс @AutoConfiguration, но это не сработало. Вместо этого, если мы используем @EntityScan в стартере, объекты загружаются, но если вы импортируете этот стартер и у вас есть объекты в проекте, которые зависят от стартера, вы вынуждены использовать @EntityScan также в нем, и, по моему мнению, это нарушает смысл автоконфигурации стартера, потому что, когда вы импортируете стартер, вам не нужно ничего делать, чтобы его использовать, да, вы можете переопределить конфигурацию по умолчанию, но не обязаны что-либо делать, возможно, чтобы объявить некоторые свойства.

Пример класса автоконфигурации в стартере:

@AutoConfiguration(after = JpaRepositoriesAutoConfiguration.class) //@AutoConfigureAfter(JpaRepositoriesAutoConfiguration.class) @EnableJpaRepositories(basePackages = "com.example.springbootstarterexample.repository") @Import({SomeServiceImpl.class, SomeEntityController.class /*, SomeEntity.class НЕ РАБОТАЕТ*/}) @EntityScan(basePackages = "com.example.springbootstarterexample.domain") публичный класс ПримерАвтоконфигурация { } а затем, если у вас есть сущности в потребителе стартера, вы должны сделать это, если у вас есть сущности в нем:

@SpringBootApplication @EntityScan(basePackages = "com.example.springbootconsumer.model") общественный класс SpringBootConsumerApplication { public static void main(String[] args) { SpringApplication.run(SpringBootConsumerApplication.class, args); } } Иначе мы можем удалить @EntityScan из стартовой версии и сделать это в потребительской среде:

@SpringBootApplication @EntityScan(basePackages = {"com.example.springbootconsumer.model", "com.example.springbootstarterexample.domain"}) общественный класс SpringBootConsumerApplication { public static void main(String[] args) { SpringApplication.run(SpringBootConsumerApplication.class, args); } } но это полностью тормозит автоконфигурацию, потому что вам нужно знать, где находятся сущности в стартере, чтобы запустить приложение. Если интересно, я написал пример.

ИЗМЕНИТЬ попробовал с @AutoConfigurationPackage

@AutoConfiguration(after = JpaRepositoriesAutoConfiguration.class) //@AutoConfigureAfter(JpaRepositoriesAutoConfiguration.class) //@EnableJpaRepositories(basePackages = {"com.example.springbootstarterexample.repository"}) @AutoConfigurationPackage(basePackageClasses = {SomeEntity.class, SomeEntityRepository.class}) @Import({SomeServiceImpl.class, SomeEntityController.class /*, SomeEntity.class НЕ РАБОТАЕТ*/}) //@EntityScan(basePackages = "com.example.springbootstarterexample.domain") публичный класс ПримерАвтоконфигурация { } Таким образом, репозиторий не создается

Описание: Параметр 0 конструктора в com.example.springbootstarterexample.service.SomeServiceImpl требовал bean-компонента типа com.example.springbootstarterexample.repository.SomeEntityRepository, который не удалось найти. Действие: Рассмотрите возможность определения bean-компонента типа com.example.springbootstarterexample.repository.SomeEntityRepository в вашей конфигурации. Если я использую @EnableJpaRepositories, для внедрения будет найден репозиторий, но не объект

@AutoConfiguration(after = JpaRepositoriesAutoConfiguration.class) //@AutoConfigureAfter(JpaRepositoriesAutoConfiguration.class) @EnableJpaRepositories(basePackages = {"com.example.springbootstarterexample.repository"}) @AutoConfigurationPackage(basePackageClasses = {SomeEntity.class}) @Import({SomeServiceImpl.class, SomeEntityController.class /*, SomeEntity.class НЕ РАБОТАЕТ*/}) //@EntityScan(basePackages = "com.example.springbootstarterexample.domain") публичный класс ПримерАвтоконфигурация { } Ошибка:

Вызвано: java.lang.IllegalArgumentException: Не управляемый тип: класс com.example.springbootstarterexample.domain.SomeEntity Используя имя пакета, я получаю тот же результат

EDIT 2 Класс @AutoConfiguration загружается с помощью META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports удален @Import:

@AutoConfiguration(after = JpaRepositoriesAutoConfiguration.class) //@AutoConfigureAfter(JpaRepositoriesAutoConfiguration.class) //@EnableJpaRepositories(basePackages = {"com.example.springbootstarterexample.repository"}) @AutoConfigurationPackage(basePackageClasses = {SomeEntity.class, SomeServiceImpl.class, SomeEntityController.class, SomeEntityRepository.class}) //@Import({SomeServiceImpl.class, SomeEntityController.class /*, SomeEntity.class НЕ РАБОТАЕТ*/}) //@EntityScan(basePackages = "com.example.springbootstarterexample.domain") публичный класс ПримерАвтоконфигурация { } пытаемся внедрить что-то в потребителя:

Описание: Параметр 0 конструктора в com.example.springbootconsumer.SpringBootConsumerApplication требовал bean-компонента типа com.example.springbootstarterexample.service.SomeService, который не удалось найти. Действие: Рассмотрите возможность определения bean-компонента типа com.example.springbootstarterexample.service.SomeService в вашей конфигурации. Похоже, что никакая конфигурация вообще не загружается.

EDIT 3 установите уровень журнала TRACE и поместите все классы в один пакет, пакет класса ExampleAutoConfiguration, который теперь выглядит следующим образом:

@AutoConfiguration(after = JpaRepositoriesAutoConfiguration.class) //@AutoConfigureAfter(JpaRepositoriesAutoConfiguration.class) //@EnableJpaRepositories(basePackages = {"com.example.springbootstarterexample.repository"}) @AutoConfigurationPackage //@Import({SomeServiceImpl.class, SomeEntityController.class /*, SomeEntity.class НЕ РАБОТАЕТ*/}) //@EntityScan(basePackages = "com.example.springbootstarterexample.domain") публичный класс ПримерАвтоконфигурация { } Я обнаружил журнал сканируемого класса @AutoConfiguration, но не могу найти в журналах ни одного bean-компонента, определенного в пакете:

2022-09-08 20:03:24.495 TRACE 17132 --- [main] a.ConfigurationClassBeanDefinitionReader: зарегистрированное определение bean-компонента для импортированного класса 'com.example.springbootstarterexample.autoconfigure.ExampleAutoConfiguration' если я использую обычную конфигурацию, я вижу, что все bean-компоненты созданы
2022-09-08 22:31:34.580 TRACE 2308 --- [main] a.ConfigurationClassBeanDefinitionReader: зарегистрированное определение bean-компонента для импортированного класса 'com.example.springbootstarterexample.service.SomeServiceImpl' 2022-09-08 22:31:34.581 TRACE 2308 --- [main] a.ConfigurationClassBeanDefinitionReader: зарегистрированное определение bean-компонента для импортированного класса 'com.example.springbootstarterexample.controller.SomeEntityController' 2022-09-08 22:31:34.585 TRACE 2308 --- [main] a.ConfigurationClassBeanDefinitionReader: зарегистрированное определение bean-компонента для импортированного класса 'com.example.springbootstarterexample.autoconfigure.ExampleAutoConfiguration' 2022-09-08 22:31:34.685 TRACE 2308 --- [main].s.d.r.c.RepositoryConfigurationDelegate: Spring Data JPA - Регистрация репозитория: someEntityRepository - Интерфейс: com.example.springbootstarterexample.repository.SomeEntityRepository - Фабрика: org.springframework.data .jpa.repository.support.JpaRepositoryFactoryBean 2022-09-08 22:31:39.094 DEBUG 2308 --- [main] org.hibernate.cfg.Ejb3Column: Столбец привязки: Ejb3DiscriminatorColumn {логическоеColumnName'DTYPE', DiscriminatorTypeName='string'} 2022-09-08 22:31:39.112 DEBUG 2308 --- [main] o.h.cfg.annotations.EntityBinder: импорт с именем объекта SomeEntity 2022-09-08 22:31:39.113 TRACE 2308 --- [main] o.hbi.InFlightMetadataCollectorImpl: Импорт: SomeEntity -> com.example.springbootstarterexample.domain.SomeEntity 2022-09-08 22:31:39.114 TRACE 2308 --- [main] o.hbiInFlightMetadataCollectorImpl: Импорт: com.example.springbootstarterexample.domain.SomeEntity -> com.example.springbootstarterexample.domain.SomeEntity
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»