2016-02-10 2 views
1

Я работаю над проектом 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.

ответ

0

Как насчет использования @ConditionalOnProperty и настройки его через файлы свойств?

This статья имеет сказать следующее:

Весной загрузки, вы можете использовать @ConditionalOnProperty аннотацию, чтобы включить или отключить конкретный компонент, основанный на наличии имущества. Это очень полезно, если вы хотите предоставить дополнительные функции для вашего микросервиса.

+0

Он не работает на объектах, если я аннотирую класс 'SomeEntity' и удаляю все объявления службы, таблица базы данных все еще создается. – Edd

Смежные вопросы