首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >排除Spring-data-rest资源的某些字段

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

Stack Overflow用户
提问于 2015-02-04 21:15:02
回答 2查看 25.4K关注 0票数 17

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

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

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

我试过这样做:

代码语言:javascript
复制
@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
}

它不起作用。然而,在评论中说:投影的答案建议使用@Projections,但是@Projections的url是这样的:“projection /recommandations{?…}”这意味着投影只是一个选项,所以整个对象仍然是公开的。

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

但它并不灵活。如果我想公开一个公共的只读API和一个私有的完全访问API。对于每个api,不能禁用此注释。

还有其他的建议吗?

EN

回答 2

Stack Overflow用户

发布于 2015-02-05 01:34:54

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

代码语言:javascript
复制
@Entity
public class User {

    @Id @GeneratedValue
    private Long id;

    private String name;

    @JsonIgnore
    private String password;
    ...

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

当您将@JsonIgnore放入域模型中时,它会使其成为默认定义。投影是用于更改要呈现的字段的选项。请看下面的示例:

代码语言:javascript
复制
@Projection(name = "noImages", types = {Item.class})
public interface NoImages {

    public Link getHtmlUrl();

}

此项目只能在呈现Item域对象时使用。它不是默认视图,而是通过?projection=noImages.使用的选项但不要忘记:当需要应用Jackson序列化时,项目将覆盖域模型的设置。这意味着您可以为上面的用户对象编写一个投影,并让它包含String getPassword()。这将覆盖域模型的默认设置,并反过来导出密码。责任在你。

最后一件事。Spring Data REST支持Excerpt Projections。最常见的用例是具有与Address对象相关的Customer对象。默认情况下,查看客户地址的关系将显示要导航的URI。但是,如果您一直需要地址信息,则可以通过创建一个呈现地址详细信息的投影来避免这种额外的GET操作。然后,您可以为 customer 对象进行配置,在默认情况下打开此投影,并在获取客户记录时内联地址详细信息。

我意识到参考文档并不是关于所有这些细节的最新版本。您可以跟踪我们的进度以适当地更新文档,如下所示:

还有一个bug,来自Spring Data REST的Alps元数据也需要过滤掉标记为@JsonIgnore的域字段(参见https://jira.spring.io/browse/DATAREST-463)

P.S. @RestResource已被弃用,并且不是设置要导出的字段的推荐方法。相反,可以使用@JsonIgnore,如前所述。

票数 23
EN

Stack Overflow用户

发布于 2017-04-12 07:05:09

根据@johannes-rudolph的建议...

考虑将此设置应用于字段(如果要从访问器映射,则将此设置应用于属性):

代码语言:javascript
复制
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)    
private String password;

这将执行访问值所暗示的操作:将关联字段标记为只写。因此,可以通过Jackson/JSON序列化形式设置该值,但不能对其进行检索。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28322376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档