Добавьте Джексона ObjectMapper в Swagger - PullRequest
0 голосов
/ 30 мая 2018

Мы используем Swagger для документирования нашего REST API.

Мы используем различные аннотации swagger в наших контроллерах Spring REST

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;

@RestController
@RequestMapping("/api/blah")
@Api("Blah")
public class SomeRestController {

    @RequestMapping(path = "/some_endpoint", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    @ApiOperation(code = CREATED, value = "Some operation",
        response = SomeResponseClass.class)
    @ApiResponses(value = {
        @ApiResponse(code = CREATED, message = "etc")
    })
    public DeferredResult<SomeResponseClass> doSomething(
        @RequestBody final SomeRequest req) {

        // do stuff

    }
}

Когда генерируется документация, она включает в себя все объекты данных, которые мыиспользовать и их определения, которые включают в себя все поля.Однако мы хотим настроить способ отображения полей в наших объектах данных в документации Swagger.Например, мы можем захотеть использовать верблюд в качестве имени поля.

Перемещение Swagger в сторону, пока я знаю, что мы можем использовать аннотации Джексона для настройки полей так, как мы хотим (используя @JsonProperty("")).Мы хотим отделить это от объектов данных, используя миксины, а затем зарегистрировать миксины в объекте данных, используя Джексон ObjectMapper.

Мой вопрос заключается в том, как зарегистрировать этот ObjectMapper с помощью Swagger, чтобы документация генерировалась согласно аннотациям?

Ответ от этой цепочки выглядит многообещающе, но я понятия не имею, куда мне добавить класс фабрики преобразователей, упомянутый в ответе.Я не знаю, как настроен запуск Swagger.Есть идеи?

1 Ответ

0 голосов
/ 30 мая 2018

Я не уверен, что я действительно отвечу на ваш вопрос ... но вот как вы конфигурируете миксы Джексона в Spring Boot (я предполагаю, что вы используете Spring Boot).

Я возьму для примера этот класс:

public class Something {

    private String fieldA;
    private Integer fieldB;

    // getters, setters, hashCode...
}

Я хочу сериализовать fieldA как field_a и игнорировать fieldB.Сначала я создаю миксин для Джексона:

public interface SomethingMixin {

    @JsonProperty("field_a")
    String getFieldA();

    @JsonIgnore
    Integer getFieldB();
}

Затем я настрою свой ObjectMapper для Spring с классом конфигурации:

@Configuration
public class JacksonConfiguration {

    @Bean
    public Jackson2ObjectMapperBuilder jacksonBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();

        builder.mixIn(Something.class, SomethingMixin.class);

        // Equivalent to your Google thread:
        // builder.propertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE)

        return builder;
    }
}

Он должен использовать эту конфигурацию для всех настроек по умолчаниюObjectMapper, включая документацию Swagger (протестировано с springfox-swagger).

...