Springfox-boot-starter swagger 即时处理

Posted

技术标签:

【中文标题】Springfox-boot-starter swagger 即时处理【英文标题】:Springfox-boot-starter swagger Instant handling 【发布时间】:2021-02-28 17:32:48 【问题描述】:

我在使用带有 Springfox-boot-starter 的 SpringBoot 的 swagger 文档方面遇到问题。

我在我的 REST API 中使用 java.time.Instant 包裹在 java.util.Optional 中工作正常:

  @GetMapping("/subscriptionId/variableAlias")
  public PaginatedResultDTO<MonitoredVariableDTO> getReportedVariables(
    @PathVariable String subscriptionId, 
    @PathVariable String variableAlias, 
    Optional<Instant> from, 
    Optional<Instant> to)  ... 

但由于某种原因,Swagger 文档无法正确处理 Optional 类型,并且似乎通过反射作为 EpochSeconds 和 Nano 属性而不是一个字段来处理它:

我想让 swagger 期待 ISO 格式的 fromto 瞬间,就像 Spring 所做的那样,以及我如何在 Insomnia 中使用它:

当我尝试删除 Optional 包装器时,它似乎可以工作

有没有办法使这个工作与可选?感谢您的建议!

春季开机版本:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.4.RELEASE</version>
    <relativePath />
</parent>

Springfox-boot-starter 版本

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

【问题讨论】:

【参考方案1】:

我们遇到了与您完全相同的问题。 我们用这个 SpringFox 配置解决了这个问题:

@Configuration
@EnableSwagger2
public class SpringfoxConfiguration 

    @Value("$api-doc.version")
    private String apiInfoVersion;

    @Autowired
    private TypeResolver typeResolver;
    @Bean
    public Docket customDocket()
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("xxx")
                //Some other code unrelated to this problem
                .alternateTypeRules(
                        // Rule to correctly process Optional<Instant> variables
                        // and generate "type: string, format: date-time", as for Instant variables,
                        // instead of "$ref" : "#/definitions/Instant"
                        AlternateTypeRules.newRule(
                                typeResolver.resolve(Optional.class, Instant.class),
                                typeResolver.resolve(Date.class), 
                                Ordered.HIGHEST_PRECEDENCE
                        ))
                .genericModelSubstitutes(Optional.class)
                .select()
                //Some more code unrelated to this problem
                .build();
    

【讨论】:

【参考方案2】:

使用 spring fox 的问题是它不使用您定义为 Bean 的自定义 ObjectMapper

Springfox 使用 new 关键字创建自己的 ObjectMapper。因此,您使用自定义ObjectMapper 注册的任何模块对于SpringFox 都是毫无意义的。但是,Springfox 提供了一个接口来使用它自己的ObjectMapper 注册模块。

在您的项目中创建一个如下所示的配置 bean,它应该可以工作。

@Configuration
public class ObjectMapperModuleRegistrar implements JacksonModuleRegistrar 
  @Override
  public void maybeRegisterModule(ObjectMapper objectMapper) 
    objectMapper.registerModule(new ParameterNamesModule())
        .registerModule(new Jdk8Module())
        .registerModule(new JavaTimeModule())
        .findAndRegisterModules();
  

【讨论】:

以上是关于Springfox-boot-starter swagger 即时处理的主要内容,如果未能解决你的问题,请参考以下文章

路由交换学习第八天:SW1成为所有VLAN的主根,SW2成为所有VLAN的备份根

08_STP(数通华为)

配置 MSTP 实现负载均衡

NAT+VRRP+不同vlan不同网段通信

企业网络中GVRP的配置使用简述 — 华为

项目实战- 企业组网方案设计