当前位置: 首页 > 知识库问答 >
问题:

排除Spring-data-rest资源的某些字段

令狐晟
2023-03-14

我正在尝试使用Spring-data-rest和spring-data-mongodb来公开只读资源。

我遇到的问题是,我想对我的文档有不同的看法。假设我在一份文件中有一些私人信息,我不想公开曝光。

所以我试了好几种方法。我阅读了这篇文章https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring,描述了如何使用JsonView来选择我们要公开的字段。

@RepositoryRestResource(collectionResourceRel = "recommandation", path =    "recommandations")
interface RecommandationRepository extends MongoRepository<Recommendation,   ObjectId> {

@Override
@JsonView(View.Public.class)
Iterable<Recommendation> findAll(Iterable<ObjectId> objectIds);
... // other find methods
}

不管用。但是在评论中说:https://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring#comment-1725671983答案建议使用@projections,然而@projections的url是这样的:“…/recommandations{?projections}”这意味着投影只是一个选项,所以整个对象仍然是公开的。

这里描述了另一种方法https://github.com/spring-projects/spring-data-rest/wiki/configuring-the-rest-url-path建议对我们不想公开的字段使用@restresource(export=false)注释。

但不灵活。如果我想公开一个公共只读API和一个私有完全访问API。不能对每个API禁用此批注。

还有别的建议吗?

共有1个答案

易俊远
2023-03-14

重要的一点是Spring Data REST基于域对象使用Jackson序列化参数,而不是存储库定义。隐藏特定字段以避免出现在JSON中的一种简单方法如下所示:

@Entity
public class User {

    @Id @GeneratedValue
    private Long id;

    private String name;

    @JsonIgnore
    private String password;
    ...

在本例中,无论如何使用此实体,我的用户对象都永远不会导出密码字段。Jackson支持将此放入字段,或者放入相应的getter方法。

当您在域模型中放置@JSONIGNORE时,它使它成为默认定义。投影是改变呈现的字段的选项。看下面的例子:

@Projection(name = "noImages", types = {Item.class})
public interface NoImages {

    public Link getHtmlUrl();

}

我意识到参考文件在所有这些细节上并不是很及时。您可以跟踪我们的进度以适当地更新文档,如下所示:

  • https://jira.spring.io/browse/datarest-449
  • https://jira.spring.io/browse/datarest-450
  • https://jira.spring.io/browse/datarest-451
  • https://jira.spring.io/browse/datarest-452
  • https://jira.spring.io/browse/datarest-453
  • https://jira.spring.io/browse/datarest-454

还有一个bug,来自Spring Data REST的ALPS元数据还需要过滤掉带有@jsonIgnore标记的域字段(请参见https://jira.Spring.io/browse/datarest-463)

 类似资料:
  • 我正在我的一个项目中使用Spring Data Rest,Spring Data Rest将为我的每个实体创建一个HTTPendpoint。不过,我想从这次扫描中排除一些实体。有这样做的选择吗?

  • 问题内容: 我正在使用Spring Boot和Spring Data Rest创建一个简单的CRUD- App(购物清单)。我有资源:。是否有一种简单的方法可以只返回属于发送请求的用户的资源?(多个用户支持)因此,用户仅获得自己的ShoppingItems,而不是每个ShoppingItem。还是我必须由我自己实现一个Controller? 我发现Spring DataREST基于用户过滤数据,这

  • 20.2.1 排除的资源 某些资源没有必要要在更改时触发重启。例如,Thymeleaf模板可以就地编辑,默认情况下,更改/META-INF/maven、/META-INF/resources、/resources、/static、/public或/templates中的资源不会触发重启,但会触发实时重新加载。如果您想自定义哪些资源改动而不会触发重启,可以使用spring.devtools.rest

  • 我有一个简单的,它使用公开。下面是实体类: 我创建了一个类,它的外观如下: 下面是repository类: 我还在配置中指定了用户投影,以确保它将被使用。 因此,当我进入/users路径时,我得到以下响应(应用了投影):

  • 我们需要改变这种反应: 到_链接上的唯一“自我”部分:

  • 我的情况:我有一个可以有很多工人的组织。我正试图按照SDR项目的主要贡献者的例子向一个组织添加一个新工人,我得到了各种错误(包括204个错误,但什么也没发生)。 以下是我的实体和Rest电话: 收到http://localhost:8080/hal 邮递http://localhost:8080/hal/workers 答复: 最后一步,按照说明中的链接: 进行一些调试,很明显具体的投诉是什么。堆