【问题标题】:Spring boot custom auto configuration for entities实体的 Spring Boot 自定义自动配置
【发布时间】:2016-02-11 23:25:35
【问题描述】:

我正在开发一个由多个较小项目组成的 Spring Boot 项目。他们都共享一个由助手类等组成的共同项目。在这个公共项目中,我正在尝试创建一个ServiceRepositoryEntity 和一个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找到。

现在在这个例子中,如果我实现 SomeServiceSomeEntitySomeRepository,控制器 bean 就会被创建(注意控制器上的 @ConditionalOnBean 注释)并且一切正常。但是我不想重新定义实体和存储库,因为所有需要的实现都已经存在,但是我找不到任何关于如何根据某些条件禁用创建这些 bean 的文档。所以问题是:

  • 如何禁用特定 @Entity 注释类的创建?
  • 如何为 @Repository 带注释的类做同样的事情?
  • 有没有更好的方法来做这种事情?

编辑:

一个更具体的问题是 - 我如何根据某些条件从扫描中排除选定的实体,是否可以在春季执行此操作?

例如,创建一组实体只是创建了某些特定的 bean 或定义了 application.properties 文件中的某些属性。

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    如何使用@ConditionalOnProperty 并通过属性文件对其进行配置?

    This的文章有以下说法:

    在 Spring Boot 中,您可以使用 @ConditionalOnProperty 注解根据属性的存在来启用或禁用特定的 bean。如果您想为微服务提供可选功能,这非常有用。

    【讨论】:

    • 它对实体不起作用,如果我注释SomeEntity 类并删除所有服务声明,仍然会创建数据库表。
    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2018-12-24
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多