【问题标题】:Spring boot rest ignore one classSpring Boot 休息忽略一类
【发布时间】:2017-11-19 05:23:21
【问题描述】:

我正在使用 spring-boot-starter-data-rest 开发一个 REST API。我想与 JPA 同步的一个类是 User 类,其中包含有关用户的信息,包括允许谁访问 API。

不幸的是,拥有 User 和 UserRepository 意味着我的 User 类在我的 API 中公开。我能够删除诸如 Id(在 configureRepositoryRestConfiguration 函数中)以及用户名和密码(通过将 @JsonIgnore 添加到我的 User 类的每个变量)之类的东西。

不幸的是,API 的用户仍然可以请求 users 表(返回一个包含空用户的列表)。虽然这不是一个真正的问题,但我宁愿删除 /users 端点。

将@JsonIgnore 添加到整个用户类是不可能的。

【问题讨论】:

  • 如果您只是从存储库界面中删除 @RepositoryRestResource 会怎样?
  • 从未定义过@RepositoryRestResource,我确实定义了公共接口UserRepository extends CrudRepository {

标签: spring spring-boot jackson spring-data-jpa spring-data-rest


【解决方案1】:

导出存储库依赖于RepositoryDetectionStrategy默认策略是:

公开所有公共存储库接口,但考虑@(Repository)RestResource 的exported 标志。

根据它来禁用“repo”的导出,您可以为此 repo 设置 exported 标志为 false

@RepositoryRestResource(exported = false)
public interface UserRepo extends JpaRepository<User, Integer> {
    //...
}

另一种方法是将RepositoryDe​​tectionStrategy全局更改为ANNOTATED

只有使用 @(Repository)RestResource 注释的存储库会被公开,除非它们的导出标志设置为 false。

@Configuration
public class RestConfig extends RepositoryRestConfigurerAdapter {
    @Override
    public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
        config.setRepositoryDetectionStrategy(RepositoryDetectionStrategy.RepositoryDetectionStrategies.ANNOTATED);
        super.configureRepositoryRestConfiguration(config);
    }
}

那么不要将@RepositoryRestResource注解应用于不需要导出的repos。

更新

我们也可以使用这个应用属性来设置策略:

spring.data.rest.detection-strategy=default

Source

【讨论】:

    【解决方案2】:

    您可以通过将此注释添加到您的存储库来隐藏某些存储库:@RepositoryRestResource(exported = false)

    更多信息在这里:http://docs.spring.io/spring-data/rest/docs/current/reference/html/#customizing-sdr.hiding-repositories

    【讨论】:

      【解决方案3】:

      projections这样的东西。

      您可以使用所需字段定义接口并将其用作存储库的方法:

      @Projection(name = "simpleUser", types = { User.class }) 
      interface SimpleUser { 
      
        String getFirstName(); 
      
        String getLastName(); 
      }
      

      【讨论】:

      • 但这就是 spring-data-rest 的重点。它的目的是为您的存储库公开一个宁静的 API,因此它的目的是没有 DTO。更多信息请参考projects.spring.io/spring-data-rest
      • @systemfreund 哦,抱歉,没有注意到 spring 数据部分
      猜你喜欢
      • 1970-01-01
      • 2021-10-28
      • 2016-09-04
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 2015-08-03
      • 2023-03-15
      相关资源
      最近更新 更多