ObjectMapper добавляет дополнительное поле в строку JSON - PullRequest
1 голос
/ 05 июня 2019

У меня следующая проблема.

Вот мой класс Accident и класс CommonDomainEntity:

@NoArgsConstructor
@AllArgsConstructor
@Data
public class Accident extends CommonDomainObject {
    private String status;
    private Date accidentDate;
    private String name;
}

@Data
public abstract class CommonDomainObject {
    public Long id;

    public boolean isNew() {
        return null == getId();
    }
}

В моем тестовом классе я звоню по следующему номеру:

String exp = objMapper.writeValueAsString(accidents);
System.out.println(exp);
ResponseEntity<String> res = restTemplate.getForEntity("/accidents", String.class);

assertEquals(HttpStatus.OK, res.getStatusCode());
JSONAssert.assertEquals(exp, res.getBody(), false);

Выдает следующую ошибку:

java.lang.AssertionError: [id=2]
Expected: new
but none found
; [id=3]
Expected: new
but none found

Я уже пытался распечатать объект exp, чтобы увидеть, что в нем, а также я пытался напечатать что s inaccidents`.

Как вы видите в журналах консоли, по какой-то причине в объекте exp есть поле new=false, и я не могу понять, откуда оно.

Вот то, что находится в моем списке несчастных случаев

Accident(status=pending, accidentDate=null, name=Name), 
Accident(status=closed, accidentDate=null, name=Name)]

А это мой exp объект в виде JSON

[{"id":2,"status":"pending","accidentDate":null,"name":"Name","new":false}, 
{"id":3,"status":"closed","accidentDate":null,"name":"Name","new":false}]

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Мне кажется, что вы конвертируете список аварий в строку и сравниваете ее с ответом на вызов restTemplate, который также является строкой. Эта служба отдыха возвращает дополнительные атрибуты, которые не являются частью объекта Accident. Исправление будет заключаться в добавлении дополнительных атрибутов к объекту аварии, чтобы выровнять ответ службы с моделью домена

0 голосов
/ 05 июня 2019

Ваш CommonDomainObject.isNew() метод в абстрактном классе оценивается как поле JSON как ObjectMapper. Вы должны исключить это, используя аннотации Джексона.

public abstract class CommonDomainObject {
    ...
    @JsonIgnore
    public boolean isNew() {
        return null == getId();
    }
}

См .:

Ваш MCVE будет:

  1. Звоните objMapper.writeValueAsString()
  2. Проверьте, почему полученное строковое представление JSON содержит поле new

Весь другой код является избыточным для воспроизведения вашей проблемы:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...