实体

时间:2016-02-10 21:02:30

标签: java spring spring-boot

我正在开发一个由多个小项目组成的Spring Boot项目。他们都共享一个由辅助类等组成的共同项目。在这个常见项目中,我尝试创建一个ServiceRepositoryEntity和一个Controller,可以在所有其他项目中共享和选择性地启用它们(使用持久数据调试端点,每个项目都有一个单独的数据库)。

我认为理想的解决方案是创建一个配置bean,应该定义该配置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文件中的某些属性。

1 个答案:

答案 0 :(得分:0)

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

This文章有以下说法:

  

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