Обработка разная JSON Запрос Джексона - PullRequest
2 голосов
/ 06 января 2020

Я работаю в проекте, где мне нужно отправить запрос на удаленный сервис в 2 разных форматах

Формат 1:

{
"templateId": "template1",
"configurationData": {
   "inboundHeaders": [
     {
      "key": "header1",
      "value": "value1"
     }, {
      "key": "header2",
      "value": "value2"
     }, {
      "key": "header3",
      "value": "value3"
     }
    ],
    "outboundHeaders": [
     {
      "key": "header4",
      "value": "value4"
     }, {
      "key": "header5",
      "value": "value5"
     }, {
      "key": "header6",
      "value": "value6"
     }
    ]
}
}

Формат 2

{
    "templateId": "template1",
    "configurationData": {
           "inboundHeaders": "head1",
           "outboundHeaders" : "head2,head3"
        }
}

Теперь я создал один класс

@JsonPropertyOrder({ "inboundHeaders", "outboundHeaders"})

public class ConfigurationData {

@JsonProperty("inboundHeaders")
private List<Header> inboundHeaders = null;

@JsonIgnore
@JsonProperty("outboundHeaders")
private List<Header> outboundHeaders = null;

@JsonProperty("inboundHeaders")
private String inboundHeader = null;

@JsonProperty("outboundHeaders")
private String outboundHeader = null;

}

Геттеры и сеттеры go здесь ....

Но когда я Я выполняю эту программу. Очевидно, я получаю следующее исключение, например

com.faster xml .jackson.databind.JsonMappingException: несколько полей, представляющих свойство

Как обрабатывать эти две разные версии (java.util.List против java.lang.String) запросов в одном Json POJO?

Ответы [ 3 ]

3 голосов
/ 06 января 2020

Я думаю, у вас есть два варианта.

  1. Создайте два класса и два метода для вызова удаленного сервиса, например:

Списки :

@JsonPropertyOrder({ "inboundHeaders", "outboundHeaders"})
public class ConfigurationDataLists {
    @JsonProperty("inboundHeaders")
    private List<Header> inboundHeaders = null;

    @JsonIgnore
    @JsonProperty("outboundHeaders")
    private List<Header> outboundHeaders = null;
}

Строки :

@JsonPropertyOrder({ "inboundHeaders", "outboundHeaders"})
public class ConfigurationDataString {
    @JsonProperty("inboundHeaders")
    private String inboundHeader = null;

    @JsonProperty("outboundHeaders")
    private String outboundHeader = null;
}
Используйте карту

Я предпочту вариант 1.

1 голос
/ 06 января 2020

Ответ от Франциско Переса абсолютно верен, но вы позже уточнили свой вопрос. Возможности ограничить новые классы - хорошо - ограничены. Вам либо нужно создать класс, представляющий каждый отдельный DTO, либо выполнить какую-то сериализацию вручную.

Одна вещь, которую вы можете сделать, - это создать интерфейс для различных типов DTO с данными конфигурации, поэтому просто:

interface IConfigurationData {}

тогда у вас есть этот шаблон создайте или измените его так, чтобы configurationData имел тип интерфейса:

@Getter @Setter
public class Template {
    private String templateId;
    private IConfigurationData configurationData;
}

Затем с использованием классов DTO в вышеупомянутом ответ разрешите им реализовать этот интерфейс, например:

public class ConfigurationDataLists implements IConfigurationData {...}

и

public class ConfigurationDataString implements IConfigurationData {...}

Тогда вы сможете выполнить два разных запроса, например:

Template template1 = new Template();
template1.setTemplateId("1");
template1.setConfigurationData(new ConfigurationDataLists());

Template template2 = new Template();
template2.setTemplateId("2");
template2.setConfigurationData(new ConfigurationDataString());
0 голосов
/ 06 января 2020

Вы не можете использовать одно и то же имя для разных свойств, как и вы. Например - inboundHeaders.

Вы должны изменить одно из свойств. Проще говоря, вы должны сохранить @ JsonProperty уникальным.

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