【问题标题】:Add Jackson ObjectMapper to Swagger将 Jackson ObjectMapper 添加到 Swagger
【发布时间】:2018-11-09 03:16:39
【问题描述】:

我们正在使用 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 启动是怎么配置的。有什么想法吗?

【问题讨论】:

    标签: java maven jackson swagger mixins


    【解决方案1】:

    我不确定我是否真的回答了你的问题......但这里是你如何在 Spring Boot 中配置 Jackson mixin(我假设你使用 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();
    }
    

    然后我将使用配置类为 Spring 配置我的ObjectMapper

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

    【讨论】:

    • 谢谢。据我所知,我们不使用 springfox。我们也不会使用您那里的 JacksonConfiguration 类。我们在对象映射器的构造函数中调用了 addMixin(),而不是 builder.mixIn() 调用。
    猜你喜欢
    • 2012-08-03
    • 2012-10-17
    • 2020-02-08
    • 2014-05-06
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2016-11-03
    相关资源
    最近更新 更多