Десериализация JSON для создания POJO и связанной ссылки - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь создать POJO с отношением к другому POJO с помощью API-интерфейса Oracle APEX ORDS RESTful.

Контекст

Позвольте мне начать с объяснения контекста, с которым мне приходится иметь дело.

Рассмотрим следующие POJO:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Brand {
    private Pencil[] pencils;
    // standard getters and setters
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class Pencil {
    private int length;
    private Brand brand;
    private Color color;
    // standard getters and setters
}

@JsonIgnoreProperties(ignoreUnknown = true)
public class Color {
    private int red;
    private int green;
    private int blue;
    // standard getters and setters
}

Структура базы данных в APEX выглядит следующим образом:

CREATE TABLE Brand (
    id int NOT NULL,
    PRIMARY KEY (id)
);
CREATE TABLE Pencil (
    id int NOT NULL,
    length int NOT NULL,
    brand_id int NOT NULL,
    color_id int NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (brand_id) REFERENCES Brand(id),
    FOREIGN KEY (color_id) REFERENCES Color(id)
);
CREATE TABLE Color (
    id int NOT NULL,
    red int NOT NULL,
    green int NOT NULL,
    blue int NOT NULL,
    PRIMARY KEY (id)
);

Шаблон URI ORDS ../brand/{brand_ID}/pencils и использует следующий источник обработчика запроса get с типом источника «Запрос»:

SELECT p.length, c.red, c.green, c.blue FROM pencil p
    LEFT OUTER JOIN color c ON c.id = p.color_id
        WHERE p.brand_id = :brand_ID

Запрос может вернуть что-то вроде следующего JSON:

{
    "items": [
        {
            "length": 100,
            "red": 150,
            "green": 200,
            "blue": 250,
        },
        {
            "length": 50,
            "red": 100,
            "green": 150,
            "blue": 200,
        }
    ],
    "first:" {
        "$ref": "..."
    }
}

Вопрос

При чтении этого JSON на стороне клиента, где создаются POJO, я столкнулся с проблемой. Я могу получить для свойства length экземпляров Pencil правильное значение. Однако свойство color экземпляра Pencil останется null. Я думаю, это потому, что свойства JSON красный, зеленый и синий неизвестны Карандашу и поэтому игнорируются. Если я прав в этом, то у меня может быть два решения, но я не знаю, как их достичь.

Несколько возможных решений

  1. Назначьте свойства класса Color с помощью аннотаций и прекратите их игнорировать, укажите, где они могут быть использованы.
  2. Каким-то образом добавьте объект JSON к каждому элементу массива в ответе с ключом color и свойствами класса Color.

1 Ответ

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

Я думаю, есть несколько вещей, которые вы могли бы попробовать.

  1. Вы можете изменить объект ответа json в соответствии с вашими объектами POJO для моделирования данных.

  2. если вы не можете изменить ответ json, чтобы он соответствовал моделированию данных на стороне клиента, вы можете создать JsonDto, который соответствует ответу json, а затем просто сконструировать ваши POJO вручную, используя JsonDto по мере необходимости.

Надеюсь, это поможет. :)

...