Spring Data Rest - скрывать вместо выставления идентификатора - PullRequest
0 голосов
/ 27 августа 2018

У меня есть объектный класс, который имеет поле естественного идентификатора, отображенное как @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 голосов
/ 27 августа 2018

Попробуйте пометить это поле с @JsonIgnore

0 голосов
/ 28 августа 2018

Спасибо всем, я думаю, что это связано с некоторой конфигурацией Спринг или Джексона, которая автоматически выставляет поле, сопоставленное с @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 нормально и нормально.

0 голосов
/ 27 августа 2018

Попробуйте пометить @NaturalId вместо @Id.

...