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

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.

  • @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) (5认同)
  • `@JsonIgnore`完全从响应中删除字段.如何在响应中返回只读字段但只是更新它们? (4认同)
  • 如果我需要一个内部表示(允许显示和修改此字段)和一个不想显示此字段的公共只读表示,@ JsonIgnore将无法帮助我吗?它将删除两个表示的字段,不是吗? (4认同)

sof*_*end 14

Per @ johannes-rudolph建议......

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

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)    
private String password;
Run Code Online (Sandbox Code Playgroud)

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