Джексон возвращается неправильно JSON - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь вернуть список маршрутов из моей базы данных Postgres. Когда я нажимаю на мою конечную точку, появляется список, в котором есть 2 объекта, но с проблемой, второй элемент в списке не имеет своего исходного объекта в качестве первого. Вот JSON:

[
{
    "id": 1,
    "weekDay": "Terça-Feira",
    "travel": 1,
    "origin": {
        "id": 1,
        "placeName": "Prefeito Mario de Menezes, Avenida",
        "placeNumber": 1,
        "placeZone": 1,
        "geom": null,
        "x": -23.266556,
        "y": -51.038334,
        "lastUpdate": 1583809200000,
        "registerDate": 1583809200000,
        "disabled": false
    },
    "startTime": "08:00 - 08:29",
    "destiny": {
        "id": 2,
        "placeName": "Ronat Valter Sodré, Rua",
        "placeNumber": 2,
        "placeZone": 2,
        "geom": null,
        "x": -23.274357,
        "y": -51.060287,
        "lastUpdate": 1583809200000,
        "registerDate": 1583809200000,
        "disabled": false
    },
    "arrivalTime": "08:00 - 08:29",
    "morador": {
        "id": 1,
        "gender": "Masculino",
        "defic": false,
        "ageRange": "20 Anos",
        "schooling": "Graduado",
        "occupation": "Assalariado",
        "place": 1,
        "lastUpdate": 1583895600000,
        "registerDate": 1583895600000,
        "disabled": false
    },
    "reason": "Lazer",
    "travelMode": "Moto (como motorista)",
    "geom": null,
    "lastUpdate": 1584561952039,
    "registerDate": 1584414000000,
    "disabled": false
},
{
    "id": 475,
    "weekDay": "Quarta-Feira",
    "travel": 475,
    "origin": 1, // THIS NEED TO BE AN OBJECT OF "PLACE"!!!
    "startTime": "18:30 - 18:59",
    "destiny": {
        "id": 81,
        "placeName": "PR 090",
        "placeNumber": 81,
        "placeZone": 81,
        "geom": null,
        "x": -23.27377,
        "y": -51.030827,
        "lastUpdate": 1583809200000,
        "registerDate": 1583809200000,
        "disabled": false
    },
    "arrivalTime": "19:00 - 19:29",
    "morador": {
        "id": 1,
        "gender": "Masculino",
        "defic": false,
        "ageRange": "20 Anos",
        "schooling": "Graduado",
        "occupation": "Assalariado",
        "place": 1,
        "lastUpdate": 1583895600000,
        "registerDate": 1583895600000,
        "disabled": false
    },
    "reason": "Trabalho",
    "travelMode": "Carro (como motorista)",
    "geom": null,
    "lastUpdate": 1584554752290,
    "registerDate": 1584414000000,
    "disabled": false
}
]

Мои модели: Маршрут:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@Entity(name = "od_routes")
@Where(clause = "disabled= false")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Route {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String weekDay;

    @Column
    private int travel;

    @ManyToOne(fetch = FetchType.LAZY)
    private Logradouro origin;

    @Column
    private String startTime;

    @ManyToOne(fetch = FetchType.LAZY)
    private Logradouro destiny;

    @Column
    private String arrivalTime;

    @ManyToOne(fetch = FetchType.LAZY)
    private Dweller dweller;

    @Column
    private String reason;

    @Column
    private String travelMode;

    @Column
    private Geometry geom;

    @Column
    private Date lastUpdate;

    @Column
    private Date registerDate;

    @Column
    private boolean disabled;
}

Житель:

 @Entity(name = "od_dweller")
 @Where(clause = "disabled = false")
 @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
 public class Dweller {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String gender;

    @Column
    private boolean defic;

    @Column
    private String ageRange;

    @Column
    private String schooling;

    @Column
    private String occupation;

    @ManyToOne
    private Place place;

    @Column
    private Date lastUpdate;

    @Column
    private Date registerDate;

    @Column
    private boolean disabled;
}

Место:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@Entity(name = "od_places")
@Where(clause = "disabled = false")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Place {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column
    private String placeName;

    @Column
    private int placeNumber;

    @Column
    private int placeZone;

    @Column
    private Geometry geom;

    @Column
    private float x;

    @Column
    private float y;

    @Column
    private Date lastUpdate;

    @Column
    private Date registerDate;

    @Column
    private boolean disabled;
}

Я что-то не так делаю? (Код был переведен так, если некоторые имена неверны, это просто ошибка перевода)

1 Ответ

0 голосов
/ 19 марта 2020

Просто удалите @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") из вашего Place класса. Я думаю, что это ничего не сломит, поскольку нет круговой ссылки на этот класс

Вы можете прочитать об этом поведении здесь

https://github.com/FasterXML/jackson-docs/wiki/Presentation-Jackson-2.0

Метод @JsonIdentityInfo работает следующим образом:

  • Идентификатор объекта всегда включается в качестве свойства (с настраиваемым именем). Это означает, что выходная форма должна быть JSON Object; и означает, что в настоящее время идентификация Java коллекций, массивов и карт не может быть обработана

  • Первый экземпляр объекта полностью сериализован (включая идентификатор объекта); дальнейшие ссылки сериализуются с использованием самого Object Id

  • Идентификаторы объектов могут быть сгенерированы (Джексон создает идентификаторы на лету) в виде UUID или порядковых номеров (целых); или предоставляется, в этом случае сам объект предоставляет значение через свойство (значение поля или метод получения).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...