ObjectMapper добавляет дополнительное поле в строку JSON

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

Вот мой 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 inаварии`.

Как видно в логах консоли почему-то в объекте 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}]

есть ли у Accident другое поле, которое не является частью конструктора? что на самом деле возвращает остальная служба? есть ли «новое» поле в возвращаемом json?

David 05.06.2019 11:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
921
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Видеть:

Ваш MCVE будет:

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

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

Большое спасибо !!! Это решило проблему. Огромное спасибо ! Я два дня с ума сходил :)

brainwavesx 06.06.2019 07:31

Я только что обновил сообщение, надеюсь, теперь все в порядке :) Спасибо за ваши исчерпывающие ответы и ваше время, чтобы исправить мою проблему.

brainwavesx 06.06.2019 12:59

Другие вопросы по теме