【问题标题】:Swagger with Spring-MVC and custom serializers使用 Spring-MVC 和自定义序列化程序 Swagger
【发布时间】:2015-02-23 10:31:56
【问题描述】:

我正在尝试使用 Swagger 记录基于 Spring-MVC 的 REST-API,但在让 Swagger 反映自定义序列化程序和反序列化程序的使用时遇到问题。

因为 JSON 必须符合既定格式(设计得不是特别好),并且我希望在 Java 类中有一个设计合理的 API 模型,所以我使用了一些 JsonSerializer 的自定义实现来生成 JSON 输出。当我在 Spring-MVC 控制器中启用带有注释的 Swagger 时,生成的文档会忽略自定义序列化程序并描述模型,就好像它已使用默认的 Jackson 设置进行序列化一样。到目前为止一切顺利,我真的没想到 Swagger 会自动理解序列化程序的实现。

然而,我期望(我在 Swagger 文档中找不到任何关于此的内容)是一种在模型类中的相关属性上使用 Swagger 注释来手动描述模型的方法。我是否遗漏了什么,或者真的不可能将 Swagger 作为与自定义序列化程序(或反序列化程序)相关的文档工具?

编辑:Swagger 文档不是特别好,但我已经尝试在偏离属性上使用 @ApiModelProperty。据我所知,它对生成的输出绝对没有影响(使用 Swagger-SpringMVC 0.8.5 和 0.9.5 测试)。

【问题讨论】:

    标签: java json spring-mvc swagger


    【解决方案1】:

    您可以使用模型替代品,例如假设您有一项服务

    @RequestMapping(value = { "/some-resource" }, method = POST, 
        consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
    @ResponseBody
    public ResponseEntity<Void> 
        businessTypeEcho(@RequestBody CustomSerializableResource business) {
        return new CustomSerializableResource();
    }
    

    您可以设置一个类型替换规则,告诉 springmvc 如何在 swagger ui 中表示自定义的可序列化类型。

    @Bean //Don't forget the @Bean annotation
    public SwaggerSpringMvcPlugin customImplementation(){
       return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)
            .apiInfo(apiInfo())
            .directModelSubstitute(CustomSerializableResource.class, SubstitutedSerializableResource.class)
            .includePatterns(".*pet.*");
    }
    
    class SubstitutedSerializableResource {
        //getters and setters that describe what 
        //CustomSerializableResource should look like in the UI
    }
    

    不幸的是,这将创建一个在运行时不使用的类型的平行宇宙。

    更新: 如果我正确理解您的评论,您正在使用它来格式化系统范围的类型,即布尔值到 Y/N 或日期到 mm/dd/yyyy。 IMO,您可能正在寻找的是使用模型替代品(参见上面的示例)。

    • 将Date 替换为String(这是prescriptive guidance)在日期的情况下,不幸的是,您只能通过特定字段或属性的文本描述来传达预期的格式。
    • 用您可以创建的枚举替换Boolean,即YesNoEnum,它表示您希望如何序列化对象。这将为文档提供一组允许的值。

    归根结底,在创建这些元类仅用于文档与标准化 API 模型以尽可能多地使用序列化原语之间进行权衡。

    【讨论】:

    • 创建和维护数据模型的完整副本只是为了记录与默认序列化规则的一些偏差似乎不是一个好主意。对我来说,mixins 如何解决这个问题也不是很明显。根据您链接到的页面,它们可用于将注释与模型类分离,但我不清楚我如何使用 mixins(也没有维护几乎相同的第二组类)可以让 Swagger在生成的文档中反映自定义序列化程序
    • 您的问题中没有具体示例。可能是需要自定义序列化的类型的具体示例会有所帮助。除了将注解与模型类解耦外,mixin 还可以通过注解(在一定程度上)影响 json 的形状。无论如何,该库将不能够推断客户序列化程序的影响。
    • 这个问题有什么不清楚的地方,需要一个具体的例子来理解它?使用专有日期格式序列化 java.util.Date 或使用字符串“yes”和“no”作为布尔值将是我使用自定义序列化程序的两种特定情况。
    • 您的问题非常清楚。只是想看看您是否有示例,以便我提出最佳解决方案。
    • 用字符串替换日期或用 YesNoEnum 替换布尔值不幸地因我的要求而崩溃,如问题中所述:“我想在 Java 类中拥有一个设计合理的 API 模型”。为了使其不必要地复杂,已建立的 JSON 格式已经使用例如true/false(真正的布尔值)、“true”/“false”(字符串)和“yes”/“no”(字符串)都表示布尔值。在 Java 模型中为布尔值使用不同的数据类型也会造成混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2013-09-09
    相关资源
    最近更新 更多