REST API. Правильная передача POJO object как json-body

Добрый вечер, коллеги!

В автотесте апи-приложения есть ресурс, который в теле запроса принимает json-структуру.
Автотесты пишутся с помощью библиотеки rest assured. Т.к. методы фрейма позволяют работать с запросом как с объектом - для передачи этой json-структуры был сформирован pojo объект.
Он включает примитивные типы данных(например, id) и объекты.
Итого, при передаче в теле запроса моего pojo - все неустановленные мной значения для примитивных типов данных по дефолту устанавливаются как 0 (если говорить про целый тип), что в принципе логично, исходя из языка.
Но не все параметры обязательны в методе и соответственно не всегда нужно передавать значения для них.
Как можно избежать передачи установленных по-умолчанию значений для примитивных типов.

Пример:

@Test
    public void testForAtInfo() {
        RequestSpecification request = RestAssured.given();
        WeatherRequest body = new WeatherRequest();
        request.contentType(ContentType.JSON);
        body.setBase("Test");
        body.setId(321);
        request.body(body, ObjectMapperType.GSON)
                .post("http://host:port/weather").then().assertThat().statusCode(201)
                .log().all();
    }

Лог:
{
“visibility”: 0,
“cod”: 0,
“id”: 321,
“base”: “Test”
}
В логе видно, что кроме установленных мной id и base передаются присутствующие в структуре “visibility”: 0,
"cod": 0,

Не использовать примитивные типы? Вместо них указать классы-обертки?

Попробуйте в классе WeatherRequest полям visibility и cod выставить
@Expose(serialize = false)

Ну а для себя, пробежать глазами по статье: Homework Help Java Projects | Help with Java Assignment

Я так понимаю вам это надо:

Не очень понимаю зачем так делать. Если значение может отсутствовать, то значит там ссылочный тип, а не простой. Проще сделать нормальный POJO с оберткой вместо простого типа.

К сожалению, так не работает. Эти поля становятся transient и при их инициализации они не сериализуются в json.

За статью спасибо, познавательно.

Так работает. Спасибо :wink:

1 Like