#java #spring-boot #spring-autoconfiguration
#java #весенняя загрузка #spring-автоконфигурация
Вопрос:
я использую следующую конфигурацию:
@Profile("database")
@Configuration
@EnableJpaRepositories(basePackages = "com.example.repository")
public class RepositoryConfig {
}
public interface MyRepositoryInterface extends PagingAndSortingRepository<MyEntity, Long> {
// ...
}
Который создает PagingAndSortingRepository
репозиторий. Как вы можете видеть, это создается только тогда, когда профиль «база данных» активен. Существует несколько других репозиториев, которые активируются с другими профилями.
Теперь я хочу создать сообщение об ошибке в случае, если репозиторий не был создан (например, при использовании неправильного профиля).
Первая мысль была такой: @Profile("!database amp; !filesystem ...")
однако это слишком громоздко для многих профилей и требует обслуживания.
Поэтому следующая мысль была следующей:
@Configuration
public class OnMissingRepository {
@ConditionalOnMissingBean(MyRepositoryInterface.class)
@Bean
public MyRepositoryInterface missingBean() {
throw new IllegalArgumentException("You forgot to specify a profile");
}
}
К сожалению, @EnableJpaRepositories
похоже, что компонент репозитория не создается до тех пор, пока @ConditionalOnMissingBean
не будет оценен. Я получаю указанное выше исключение каждый раз.
Есть ли способ реализовать это здесь?
Спасибо!
Комментарии:
1. Разве приложение не взорвалось бы в любом случае без репозиториев? Если репозиториев нет, я бы ожидал, что некоторые службы выйдут из строя. Это
@Conditional
не будет работать, поскольку они оцениваются очень рано. Вашей единственной надеждой может бытьBeanPostProcessor
то, что проверяет реализацию компонентовRepository
(самый верхний интерфейс тегов Spring Data), если ни один из них не доступен, генерирует исключение.2. Это правильно, приложение не запустится, потому что Spring не может разрешить зависимость. Но сообщение об ошибке слишком неспецифично и может относиться к чему угодно, поэтому я хотел дать подсказку о профилях. Но спасибо за ответ.
3. Эта ошибка, как правило, довольно специфична для того, какой компонент отсутствует. Существует даже анализатор исключений, который делает это сообщение более понятным.