将Jackson ObjectMapper添加到Swagger

时间:2018-05-30 09:59:20

标签: java maven jackson swagger mixins

我们正在使用Swagger来记录我们的REST API。

我们在Spring REST控制器中使用各种swagger注释

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放在一边我知道我们可以使用Jackson注释以我们想要的方式配置字段(使用@JsonProperty(""))。我们想使用mixins将它与数据对象分开,然后使用jackson ObjectMapper将mixins注册到数据对象。

我的问题是如何使用Swagger注册此ObjectMapper,以便根据注释生成文档?

来自this thread的答案看起来很有希望,但我不知道应该在哪里添加答案中提到的转换器工厂类。我不知道如何配置Swagger启动。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我不确定我是否真的回答了你的问题......但是这里是你如何在Spring Boot中配置Jackson mixins(我假设你使用Spring Boot)。

我将以此类为例:

public class Something {

    private String fieldA;
    private Integer fieldB;

    // getters, setters, hashCode...
}

我想将fieldA序列化为field_a,我想忽略fieldB。首先,我为Jackson创建了一个mixin:

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测试)。