Отображение String x = "[]" в JsonNode приводит к дополнительным кавычкам (Spring Boot) - PullRequest
0 голосов
/ 01 июня 2018

Для написания теста для определенной функции мне нужно привести строку, содержащую [], в JsonNode.

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

То, что я ожидаю "[]", но то, что я получаю "" [] "", что приводит к провалу теста.Когда я отлаживаю код в нормальной работе, я получаю только «[]» при тестировании кода с Postman вместо неработающего «« [] »«, который я получаю только во время тестов.

Этокак выглядит мой DTO в Spring Boot

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.JsonNode;

public class PostLabelDTO {


    private final String templateId;

    private final String labels;

    @JsonCreator
    public PostLabelDTO(
            final @JsonProperty("templateId") String templateId,
            final @JsonProperty("labels") JsonNode labels
    ) {
        this.templateId = templateId;
        this.labels = labels.toString();
    }

    public String getId() {
        return templateId;
    }

    public String getData() {
        return labels;
    }
}

Мой тест должен подделать этот объект со свойствами для передачи методу, который будет проверен.

Мой тест выглядит следующим образом:

@Test
    public void getEmptyDocumentException() throws InvalidBarcodeException, EmptyStringException, InvalidBarcodeGeometryException, EmptyFieldException, TemplateNotFoundException, InvalidBarcodeStrategyException {

        //defining an ID for the templateId JsonProperty
        final String templateId = "fj2j931j2ijd1";

        //this is the "labels" JsonNode that gets sent in through the Post request
        //i checked 10 times how the value comes into the DTO and it was always "[]" (empty labels (document) object, for which I wrote this test for)

        final String jsonString = "[]";

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(JsonParser.Feature.ALLOW_MISSING_VALUES);

        JsonNode labels = mapper.valueToTree(jsonString);


        //when I do this, the "[]" which is normally passed into the PostLabelDTO, becomes ""[]"", so there are extra quotes added
        PostLabelDTO dto = new PostLabelDTO(templateId, labels);

        final Document document = new Document(dto, templateRepository);
        Exception resultingException = null;

        try {
            document.getPDF();
        } catch (Exception e) {
            e.printStackTrace();


            assertThat(resultingException).isExactlyInstanceOf(EmptyDocumentException.class);
        }

    }

Таким образом, я попытался поместить вышеуказанный Json в новый экземпляр PostLabelDTO в качестве объекта labels JsonNode для тестирования, но он не работает.

Это запрос, с которым он работает через почтальона (он работает как, он выдает правильное исключение)

{
    "templateId":"5b1140608134691d1804e74e",
    "labels":[]
}

Так что в основном я попытался поместить вышеупомянутый Json в новый экземпляр PostLabelDTO какlabels Объект JsonNode для тестирования, но он не работает.

Это рабочий запрос (который возвращает PDF-файл с метками на каждой странице)

{
    "templateId": "5b1140608134691d1804e74e",
    "labels": [{
        "data": {
            "Ivolgnr": "Volgnr",
            "Ilkw-nr": "Ilkw-nr",
            "bedrijf": "Hornbach",
            "wagenNr": "13513542626",
            "barcode": {
                "waarde": "9780471117094"
            },
            "leverdatumVan": "x",
            "leverdatumNaar": "x",
            "orderList": [{
                    "order": [{
                            "articlenumber": "29-840-4512"
                        },
                        {
                            "description": "Mooie grote plant"
                        },
                        {
                            "ordernumber": "3584479012860361"
                        },
                        {
                            "amount": "20"
                        },
                        {
                            "sellprice": "€5,00"
                        },
                        {
                            "deliverydate": "01-09-2018"
                        }
                    ]
                },
                {
                    "order": [{
                            "articlenumber": "29-840-4512"
                        },
                        {
                            "description": "Mooie grote plant"
                        },
                        {
                            "ordernumber": "3584479012860361"
                        },
                        {
                            "amount": "20"
                        },
                        {
                            "sellprice": "€5,00"
                        },
                        {
                            "deliverydate": "01-09-2018"
                        }
                    ]
                },
                {
                    "order": [{
                            "articlenumber": "29-840-4512"
                        },
                        {
                            "description": "Mooie grote plant"
                        },
                        {
                            "ordernumber": "3584479012860361"
                        },
                        {
                            "amount": "20"
                        },
                        {
                            "sellprice": "€5,00"
                        },
                        {
                            "deliverydate": "01-09-2018"
                        }
                    ]
                },
                {
                    "order": [{
                            "articlenumber": "29-840-4512"
                        },
                        {
                            "description": "Mooie grote plant"
                        },
                        {
                            "ordernumber": "3584479012860361"
                        },
                        {
                            "amount": "20"
                        },
                        {
                            "sellprice": "€5,00"
                        },
                        {
                            "deliverydate": "01-09-2018"
                        }
                    ]
                },
                {
                    "order": [{
                            "articlenumber": "29-840-4512"
                        },
                        {
                            "description": "Mooie grote plant"
                        },
                        {
                            "ordernumber": "3584479012860361"
                        },
                        {
                            "amount": "20"
                        },
                        {
                            "sellprice": "€5,00"
                        },
                        {
                            "deliverydate": "01-09-2018"
                        }
                    ]
                }

            ]
        }
    }, {
        "data": {
            "Ivolgnr": "22324rff",
            "Ilkw-nr": "246426246",
            "bedrijf": "bedrijfffff",
            "wagenNr": "wagennrrrrrrr",
            "barcode": {
                "waarde": "9780471117094"
            },
            "leverdatumVan": "x",
            "leverdatumNaar": "x",
            "orderList": [{
                "order": [{
                        "articlenumber": "a"
                    },
                    {
                        "description": "b"
                    },
                    {
                        "ordernumber": "c"
                    },
                    {
                        "amount": "d"
                    },
                    {
                        "sellprice": "e"
                    },
                    {
                        "deliverydate": "f"
                    }
                ]
            }]
        }
    }]
}

ВНИМАНИЕ Схема метки (называемая данными для каждогоБел в этом запросе) всегда может варьироваться в зависимости от того, какой шаблон используется для заполнения.Поэтому нет возможности создать объект Label, содержащий все свойства, поскольку они всегда различаются (зависит от HTML-кода шаблона, который должен быть заполнен этим запросом. Мой сервис выполняет «поиск и замену» на основе имени свойства тега.

Я уже пробовал это: Как проанализировать строку JSON в JsonNode в Джексоне?

Но я не могу добавить пустой массив к объекту JsonNode в качестве егодолжен.

Может кто-нибудь помочь мне?

С уважением,

Али

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Попробуйте использовать labels как String[] в PostLabelDTO

public class PostLabelDTO {

    private final String templateId;

    private final String[] labels;

    public String[] getLabels() {
        return labels;
    }

    @JsonCreator
    public PostLabelDTO(final @JsonProperty("templateId") String templateId,
            final @JsonProperty("labels") String[] labels) {
        this.templateId = templateId;
        this.labels = labels;
    }

    public String getId() {
        return templateId;
    }

}

Затем протестируйте этот код, как показано ниже:

String str[] = {};
PostLabelDTO postLabelDTO = new PostLabelDTO("fj2j931j2ijd1", str);

Для вашего фактического запроса с этим большим JSON,у вас должно быть PostLabelDTO, как показано ниже

public class PostLabelDTO {

@JsonProperty("templateId")
private String templateId;
@JsonProperty("labels")
private List<Label> labels = null;
....
}

Попробуйте сгенерировать POJO из JSON, используя ссылку jsonschema2pojo , она сгенерирует правильные классы JAVA, и вы можете проверить работу с использованием этого вызова, используя вашфактическое тело запроса JSON.

0 голосов
/ 01 июня 2018

Итак, в основном в коде есть следующее: final String jsonString = "[]";

Но в своем запросе от почтальона вы отправляете labels как тип Array, а не как String.

Поскольку здесь не так много информации, вы можете проверить с этим телом:

{
"templateId":"5b1140608134691d1804e74e",
"labels":"[]"
}

И поделиться выводом, или даже это (разница в типах) может помочь вам понять неожиданное поведение, которое высталкиваются, где в его попытке преобразовать массив в тип String.В тестовом классе вы должны попытаться получить JsonNode из arrayType String[] labels in test class


ОБНОВЛЕНИЕ: при использовании String [] вместо String для меток, вы также должны указать тип прохода при получении JsonNode с String []. Обратитесь к этой ссылке, чтобы узнать, как это сделать .

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