【问题标题】:Springfox-boot-starter swagger Instant handlingSpringfox-boot-starter swagger 即时处理
【发布时间】: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>

【问题讨论】:

    标签: java spring-boot rest swagger springfox


    【解决方案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();
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-29
        • 2015-12-14
        • 2020-02-25
        • 2017-07-02
        • 2019-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多