【发布时间】:2016-02-11 23:25:35
【问题描述】:
我正在开发一个由多个较小项目组成的 Spring Boot 项目。他们都共享一个由助手类等组成的共同项目。在这个公共项目中,我正在尝试创建一个Service、Repository、Entity 和一个Controller,它们可以与所有其他项目一起共享和选择性启用(使用持久数据调试端点,每个项目都有一个单独的数据库)。
我认为理想的解决方案是创建一个配置 bean,应该定义它以启用这些功能或类似的东西。
目前我有这个设置。共同实体:
@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,控制器 bean 就会被创建(注意控制器上的 @ConditionalOnBean 注释)并且一切正常。但是我不想重新定义实体和存储库,因为所有需要的实现都已经存在,但是我找不到任何关于如何根据某些条件禁用创建这些 bean 的文档。所以问题是:
- 如何禁用特定
@Entity注释类的创建? - 如何为
@Repository带注释的类做同样的事情? - 有没有更好的方法来做这种事情?
编辑:
一个更具体的问题是 - 我如何根据某些条件从扫描中排除选定的实体,是否可以在春季执行此操作?
例如,创建一组实体只是创建了某些特定的 bean 或定义了 application.properties 文件中的某些属性。
【问题讨论】:
标签: java spring spring-boot