如何在spring-data-rest中防止relTargetType的json输出?

时间:2016-02-05 12:52:59

标签: java spring spring-data-rest

我正在创建@RepositoryRestResource并将其导出为休息服务,如下所示:

@RepositoryRestResource(collectionResourceRel = "myContent", path = "myContent")
public interface MyContentRepository extends PagingAndSortingRepository<MyContentEntity, Long> {

}

问题:当我请求内容时,我得到以下摘录:

  "content" : [ {
    "value" : [ ],
    "rel" : null,
    "collectionValue" : true,
    "relTargetType" : "com.domain.MyContentEntity"
  } ],

问题:如何防止公开relTargetType包和&#34;真实&#34;域名?

2 个答案:

答案 0 :(得分:1)

在您的POJO中:

如果您根本不想在JSON中使用relTargetType:

@JsonIgnore
public String getRelTargetType() {
    return relTargetType;
}

如果你只想隐藏包裹:

public String getRelTargetType() {
    return relTargetType.split("\\.")[2];
}

如果要隐藏包并返回其他域名:

public String getRelTargetType() {
    return "AlteredDomainName";
}

答案 1 :(得分:0)

我不熟悉Spring Rest Data,但据我所知,它使用Jackson进行JSON处理。

如果确实如此,我建议您的情况要求使用Mix-in annotations,这些用于控制无法修改的类的序列化。

首先使用JsonIgnoreType注释集创建一个简单的混合类。

@JsonIgnoreType
public class OmitType {}

接下来,在所使用的ObjectMapper实例中注册混合。据我所知,您可以通过these instructions

访问Spring Rest Data中的访问权限
  

将自己的Jackson配置添加到使用的ObjectMapper中   Spring Data REST,覆盖configureJacksonObjectMapper方法。   该方法将传递给ObjectMapper [...]

configureJacksonObjectMapper方法中,使用不需要的类型注册混合:

objectmapper.addMixIn(RelTargetType.class, OmitType.class);

请注意,RelTargetType.class只是猜测。更改为字段实际包含的任何类型。这应该使Jackson在遇到它时忽略该特定类型的字段。

加了:

如果relTargetType中的MyContentEntity字段实际上只是一个字符串字段,则可以将混合更改为以下内容:

public abstract class OmitType {
    @JsonIgnore
    public abstract String getRelTargetType();
}

注册它应该改为:

objectmapper.addMixIn(MyContentEntity.class, OmitType.class);