Hug*_*ège 12 java spring-data-rest spring-data-mongodb
我正在尝试使用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
}
Run Code Online (Sandbox Code Playgroud)
它不起作用.但是在评论中说:https ://spring.io/blog/2014/12/02/latest-jackson-integration-improvements-in-spring#comment-1725671983答案建议使用@Projections但是@Projections结果在这样的URL中:".../recommandations {?projection}"这意味着投影只是一个选项,因此完整的对象仍然是暴露的.
这里描述了另一种方法https://github.com/spring-projects/spring-data-rest/wiki/Configuring-the-REST-URL-path 它建议对字段使用@RestResource(exported = false)注释我们不想暴露.
但它并不灵活.如果我想公开一个公共只读API和一个私有的完整访问API.每个api不能禁用此注释.
还有其他建议吗?
gre*_*urn 20
重要的一点是,Spring Data REST使用基于域对象的Jackson序列化参数,而不是存储库定义.隐藏特定字段以显示在JSON中的一种简单方法是这样的:
@Entity
public class User {
@Id @GeneratedValue
private Long id;
private String name;
@JsonIgnore
private String password;
...
Run Code Online (Sandbox Code Playgroud)
在此示例中,无论如何使用此实体,我的User对象都将永远不会导出密码字段.杰克逊支持将其放在场上,或者采用相应的吸气方法.
当您将@JsonIgnore放在域模型中时,它会使其成为默认定义.预测是改变要渲染的字段的选项.请看以下示例:
@Projection(name = "noImages", types = {Item.class})
public interface NoImages {
public Link getHtmlUrl();
}
Run Code Online (Sandbox Code Playgroud)
此项目只能在呈现项目域对象时使用.它不是默认视图,而是使用via ?projection = noImages的选项.但是不要忘记:当应用Jackson序列化时,项目将覆盖域模型的设置.这意味着您可以在上面为该User对象编写投影,并使其包含String getPassword().这将覆盖域模型的默认设置,然后导出密码.责任是你的.
最后一件事.Spring Data REST支持摘录预测.最常见的用例是具有与Address对象相关的Customer对象.默认情况下,查看客户地址的关系会显示要导航的URI.但是如果您一直想要地址信息,可以通过创建呈现地址详细信息的投影来避免这种额外的GET操作.然后,您可以为Customer对象配置,默认情况下启用此投影,并在您获取客户记录时基本上内联地址详细信息.
我意识到参考文档并不是所有这些细节都是最新的.您可以跟踪我们的进度以适当更新文档,如下所示:
还有一个错误,即Spring Data REST中的ALPS元数据还需要过滤掉用@JsonIgnore标记的域字段(请参阅https://jira.spring.io/browse/DATAREST-463)
不推荐使用PS @RestResource,这不是设置导出哪些字段的推荐方法.相反,如前所示使用@JsonIgnore.
sof*_*end 14
Per @ johannes-rudolph建议......
考虑将此设置应用于字段(如果从访问者映射,则应用此属性):
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String password;
Run Code Online (Sandbox Code Playgroud)
这将执行访问值所暗示的操作:将关联字段标记为只写.因此,可以设置该值,但不能通过Jackson/JSON序列化表单检索.