Spring Data Rest-隐藏而不是公开ID

时间:2018-08-27 12:37:04

标签: java spring-boot jackson entity id

我有一个实体类,该实体类的自然ID字段映射为@Id,并且没有任何替代ID(仅表ID的发明字段)字段。而且,在杰克逊编组的JSON中,我看到了一个额外的id

所以代替:

{
    "bin":"123456", ...
}

我知道:

{
    "id":"123456", "bin":"123456", ...
}

我不想要,因为它们是重复的信息。我该如何预防?

我还没有接触过REST / MVC配置适配器;它们是用于公开ID类的,但是我不希望这样。

Bean:

@Entity
@Data
@Table(name="bin_info")
public class BinInfo implements Serializable, Persistable<String> {
    @Id
    @NotBlank //this is for absent parameter. Not equal to Pattern regex check
    @Pattern(regexp = "^\\d{6,8}$") //6-8 digits
    @Column(name="bin")
    @JsonProperty("bin")
    private String bin;

    ...

我具有以下依赖性:

dependencies {
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-aop')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('org.springframework.boot:spring-boot-starter-data-rest')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('org.springframework.boot:spring-boot-starter-undertow')
    runtime('com.h2database:h2')
    runtime('org.postgresql:postgresql')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('io.cucumber:cucumber-java:3.0.2')
    testCompile('io.cucumber:cucumber-junit:3.0.2')
    testCompile('io.cucumber:cucumber-spring:3.0.2')
}

Spring Boot 2.0.3。

3 个答案:

答案 0 :(得分:0)

尝试使用@NaturalId而不是@Id进行注释。

答案 1 :(得分:0)

非常感谢,我认为这与Spring或Jackson的某些配置有关,这些配置将自动公开用@Id映射的字段。我只能猜测,因为没有时间进行确认。

一些同事建议我定义DTO而不是在类中放置@Jsonxxx批注,说模型表示数据模型并与表相关,而DTO与视图层相关。所以我做到了,现在一切都很好。

现在,该模型中没有id字段和@JsonProperty / @JsonIgnore

@Entity
@Data
@Table(name="bin_info")
public class BinInfo implements Serializable, Persistable<String> {
    @Id
    @NaturalId
    @NotBlank //this is for absent parameter. Not equal to Pattern regex check
    @Pattern(regexp = "^\\d{6,8}$") //6-8 digits
    @Column(name="bin")
    //@JsonProperty("bin")
    private String bin;

    ...

DTO完全没有@Id

@Data
public class BinInfoDTO {
    @JsonProperty("bin")
    private String bin;

    @JsonProperty("json_full")
    private String json_full;

    ...

检索实体时,使用映射方法将DTO中需要的所有值设置为DTO,然后将其返回到端点。那么JSON就正常了。

答案 2 :(得分:-1)

尝试用@JsonIgnore注释该字段