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 格式的 from 和 to 瞬间,就像 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 即时处理的主要内容,如果未能解决你的问题,请参考以下文章