【问题标题】:Is the annotation @EnableMongoRepositories required while creating rest endpoints using Spring data rest @RepositoryRestResource使用 Spring 数据休息 @RepositoryRestResource 创建休息端点时是否需要注释 @EnableMongoRepositories
【发布时间】:2019-10-02 10:42:30
【问题描述】:

我正在尝试使用 @RepositoryRestResource 注释创建弹簧数据休息端点的弹簧引导指南。我观察到的是,在指南中,他们没有指定我们使用任何其他注释而不是@RepositoryRestResource。所以我所做的是:

public class Merchant{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

@RepositoryRestResource(collectionResourceRel = "account", path = "account")
public interface MerchantRepository extends MongoRepository<Merchant, String> {

    List<Person> findByLastName(@Param("name") String name);

}

只要我把所有东西都放在同一个包里,它似乎就可以工作。所以,我试图理解为什么即使我们没有使用通常用于为 CRUD 操作提供默认实现的注释 @EnableMongoRepositories 等,这仍然有效?从文档中可以明显看出MongoRepository 内部扩展了PagingAndSortingRepository 接口,而CrudRepository 接口又扩展了CrudRepository 接口。有人可以解释一下这是如何工作的吗?

【问题讨论】:

  • 你可以定义单独的包并且你必须@ComponentScan(你的包名)。 @Enable* 相关注解应该在主spring boot类中使用。
  • @Sambit 你没抓住重点,我想了解它是如何工作的

标签: java spring spring-boot spring-data-mongodb spring-data-rest


【解决方案1】:

当使用常规 Spring(不是 Spring Boot)应用程序或不遵守 general recommendations for a Spring Boot application(将 @SpringBootApplication 注释类放在 top-level package 中)时,您必须添加 @EnableMongoRepositories 注释。

如果您使用的是 Spring Boot 并遵循一般建议,则无需添加注释。 Spring Boot 通过在您显然想要使用的类路径上检测 Mongo 和 Spring Data MongoDB 来计算。请参阅MongoRepositoriesAutoConfiguration 类(注意:这是 Spring Boot 类而不是 Spring Data MongoDB 类)。

【讨论】:

    【解决方案2】:

    Spring Boot 依赖于自动配置。每个自动配置类都有一些启用它的触发器(比如类路径中存在一些类,缺少一些 bean)并自动配置一些服务(通过注册 bean 等)

    在您的情况下,您正在寻找MongoRepositoriesAutoConfiguration

    Spring Data 的 Mongo 存储库的自动配置。 当上下文中没有配置 MongoRepositoryFactoryBean 类型的 bean,Spring Data Mongo MongoRepository 类型在类路径上,Mongo 客户端驱动程序 API 在类路径上,并且没有其他配置的 MongoRepository 时激活。

    一旦生效,自动配置就相当于使用 EnableMongoRepositories 注解启用 Mongo 存储库。

    【讨论】:

    • 为什么官方文档中没有为spring data rest with mongo指定这个?我们什么时候应该添加这个注释?只有当@RepositoryRestResource因为类路径或包而没有自动配置所有内容时变化?
    • 作为一个经验法则,我遵循约定优于配置,如果 spring Boot 自动配置了我想要的功能,则不要添加配置(这是个人意见)。我更进一步——如果触发器很简单(打包、添加属性),我倾向于修改它们的代码以符合约定,而不是添加自定义配置。如果您需要更多控制,您确实需要检查 javadoc。有自动配置类读取的属性,您可以定义自己的 bean。如果您需要更多控制,可以禁用特定的自动配置类。
    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 2016-01-26
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-24
    相关资源
    最近更新 更多