0

我浪费了很多时间试图弄清楚如何在SpringFox (Docket openapi v3.0) 生成的api-docs的输出中为我的 Spring 控制器设置默认 MediaType。最后,我发现了一个几乎未记录的接口OperationBuilderPlugin,理论上它允许我在 OperationContext 中设置一些属性,但不幸的是,尽管在构建操作时我正在寻找的属性似乎被忽略了:

@Override
public void apply(OperationContext context) {
    context.operationBuilder()
            .produces(new LinkedHashSet<>(
                Collections.singletonList(MediaType.APPLICATION_JSON_VALUE)));
}

还尝试将产品直接设置到 Docket 中,但仍然没有运气

@Bean
public Docket api() {
    ....
    return new Docket(DocumentationType.OAS_30)
                .securityContexts(Collections.singletonList(securityContext()))
                .securitySchemes(Collections.singletonList(authenticationScheme))
                .useDefaultResponseMessages(true)
                .consumes(new HashSet<>(Arrays.asList(MediaType.APPLICATION_JSON_VALUE,
                        MediaType.APPLICATION_XML_VALUE)))
                .produces(new LinkedHashSet<>(Arrays.asList("application/json", "application/xml")))
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any())
                .build();
    ...
}

我不想在控制器类级别(或方法级别)指定返回 MediaType,所以如果我找不到更干净的解决方案,我最后的机会是在下载 api 后用我想要的媒体类型手动替换 */* -docs.json 来自远程 url。

有人遇到过同样的问题吗?任何帮助将不胜感激,在此先感谢

4

1 回答 1

0

自己解决了。最后,我用另一个 bean MyResponseMessagesReader 覆盖了 bean ResponseMessagesReader,它与原始类几乎相同,但是在下面的方法中,我改变了produces在空集的情况下的条件,它添加了 json 媒体类型

private void applyMyReturnTypeOverride(OperationContext context) {
 ...
      if (produces.isEmpty()) {
        produces.add(MediaType.APPLICATION_JSON);
      }
 ...
}

这是我能够进入操作创建过程的唯一联合点,也许有更好的方法(使用一些最简洁的策略实现 OperationBuilderPlugin),但我的时间正在为这个解决方案打勾。

希望这可以帮助其他需要相同 API 生成行为的人

于 2021-07-15T10:12:13.940 回答