Я работаю над проектом Spring Boot, который состоит из нескольких небольших проектов. Все они имеют общий проект, состоящий из вспомогательных классов и т. Д. В этом общем проекте я пытаюсь создать Service
, Repository
, Entity
и Controller
, которые могут быть совместно использованы и выборочно включены по всем другим проектам (отладка конечных точек с сохраненными данными, каждый проект имеет отдельную базу данных).Конфигурация автоматической настройки Spring для объектов
Я думаю, что идеальным решением для этого является создание конфигурационного компонента, который должен быть определен, чтобы включить эти функции или что-то в этом направлении.
На данный момент у меня есть эта настройка. Общая организация:
@MappedSuperclass
public class SomeEntity {
@Id
@GeneratedValue
protected Long id;
@Column(unique = true)
protected String name;
public SomeEntity() {
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
}
Сервис, определяющие общие методы:
public abstract class SomeEntityService<T extends SomeEntity> {
private final SomeRepository<T> someRepository;
public SomeEntityService(SomeRepository<T> someRepository) {
this.someRepository = someRepository;
}
public T getSomeEntity(String name) {
return someRepository.findByName(name);
}
public List<T> getSomeEntities() {
return someRepository.findAll();
}
public abstract void init();
}
Общий контроллер:
@RestController
@RequestMapping(value = "/entities")
@ConditionalOnBean(value = SomeEntityService.class)
public class SomeController<T extends SomeEntity> {
private final SomeEntityService<T> someEntityService;
@Autowired
public SomeController(SomeEntityService<T> someEntityService) {
this.someEntityService = someEntityService;
}
@RequestMapping(method = RequestMethod.GET)
public List<T> getSomeEntities() {
return someEntityService.getSomeEntities();
}
@RequestMapping(value = "/{name}", method = RequestMethod.GET)
public T getSomeEntity(@PathVariable String name) {
return someEntityService.getSomeEntity(name);
}
}
Общий репозиторий:
@NoRepositoryBean
public interface SomeRepository<T extends SomeEntity> extends JpaRepository<T, Long>, JpaSpecificationExecutor<T> {
T findByName(String name);
}
Полный проект можно найти here.
Сейчас в этом примере, если я реализую SomeService
, SomeEntity
и SomeRepository
, контроллер боб получает создан (обратите внимание на @ConditionalOnBean
аннотацию на контроллере) и все работает отлично. Однако я не хочу переопределять сущность и репозиторий, поскольку вся необходимая реализация уже существует, однако я не могу найти никакой документации о том, как отключить создание этих компонентов на основе некоторых условий. Таким образом, вопросы будут следующими:
- Как я могу отключить создание конкретных аннотированных классов
@Entity
? - Как я могу сделать то же самое для
@Repository
аннотированных классов? - Есть ли лучший способ делать такие вещи?
Edit:
Более конкретный вопрос будет - как я мог исключить выбранные объекты из сканирования на основе некоторого условия, можно сделать это весной?
Например, для создания набора сущностей создается определенный конкретный компонент или определенное свойство в файле application.properties.
Он не работает на объектах, если я аннотирую класс 'SomeEntity' и удаляю все объявления службы, таблица базы данных все еще создается. – Edd