如何在springdoc-openapi中拥有真正的应用程序生成的响应模式?

How to have the real application-produced response schema in springdoc-openapi?

提问人:Sebu 提问时间:11/6/2023 更新时间:11/7/2023 访问量:37

问:

我有一个 Spring Boot 项目用于创建 openapi 规范并显示 Swagger UI。该项目还使用 Jackson 以 JSON 格式序列化数据。Jackson 配置为理解类型并将它们序列化为字符串(请参阅下面的配置)。但是,在运行项目并查看 Swagger UI 时,openapi 计算的响应架构与实际序列化不同。在以下两个代码片段中,可以看到字段的差异,其类型为 。另请注意,字段的架构计算有效,其类型为 。springdoc-openapi-starter-webmvc-uijava.time@Bean ObjectMappertest2java.time.YearMonthtest1java.time.Instant

实际响应:

{
  "test1": "2023-11-06T10:53:42.781130500Z",
  "test2": "2023-11"
}

openapi 的响应架构:

{
  "test1": "2023-11-06T10:53:42.788Z",
  "test2": {
    "year": 0,
    "month": "JANUARY",
    "monthValue": 0,
    "leapYear": true
  }
}

这是控制器:

@RestController
public class TestController {
    @GetMapping("/test")
    public TestDto testDto() {
        TestDto testDto = new TestDto();
        testDto.setTest1(Instant.now());
        testDto.setTest2(YearMonth.now());
        return testDto;
    }
}

这是模型类:

@Data
public class TestDto {
    private Instant test1;
    private YearMonth test2;
}

和配置:ObjectMapper

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        return objectMapper;
    }

我知道我可以做到以下几点:

@Data
public class TestDto {
    private Instant test1;
    @Schema(type = "string", format = "yearmonth", example = "2020-07")
    private YearMonth test2;
}

这将起作用:在 openapi-specification 中,架构将如下所示:

{
  "test1": "2023-11-06T11:13:56.750Z",
  "test2": "2020-07"
}

这正是我想要的。但是,我不想手动添加此注释,因为这可能会影响多个类中的多个字段。我希望 openapi 规范具有我的应用程序生成的确切响应架构。我怎样才能做到这一点?@Schema

这是一个 MWE:https://github.com/SebastianOltmanns/springdoc-jackson

java json spring-boot 杰克逊 springdoc

评论


答: 暂无答案