我正在尝试使用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
}它不起作用。然而,在评论中说:投影的答案建议使用@Projections,但是@Projections的url是这样的:“projection /recommandations{?…}”这意味着投影只是一个选项,所以整个对象仍然是公开的。
这里描述了另一种方法,它建议对我们不想公开的字段使用@RestResource( https://github.com/spring-projects/spring-data-rest/wiki/Configuring-the-REST-URL-path = false)注释。
但它并不灵活。如果我想公开一个公共的只读API和一个私有的完全访问API。对于每个api,不能禁用此注释。
还有其他的建议吗?
发布于 2015-02-05 01:34:54
重要的一点是,Spring Data REST基于域对象而不是存储库定义使用Jackson序列化参数。隐藏特定字段使其不出现在JSON中的一种简单方法如下:
@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String name;
@JsonIgnore
private String password;
...在本例中,无论如何使用此实体,我的User对象都不会导出密码字段。Jackson支持将其放到场上,或者放在相应的getter方法上。
当您将@JsonIgnore放入域模型中时,它会使其成为默认定义。投影是用于更改要呈现的字段的选项。请看下面的示例:
@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,如前所述。
发布于 2017-04-12 07:05:09
根据@johannes-rudolph的建议...
考虑将此设置应用于字段(如果要从访问器映射,则将此设置应用于属性):
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;这将执行访问值所暗示的操作:将关联字段标记为只写。因此,可以通过Jackson/JSON序列化形式设置该值,但不能对其进行检索。
https://stackoverflow.com/questions/28322376
复制相似问题