Swagger OpenApi 动态查询参数名称使用 Spring 自定义解析器的注释

Posted

技术标签:

【中文标题】Swagger OpenApi 动态查询参数名称使用 Spring 自定义解析器的注释【英文标题】:Swagger OpenApi dynamic query param name using annotation for Spring custom resolver 【发布时间】:2021-02-14 23:03:50 【问题描述】:

我试图弄清楚如何向SpringDoc OpenApi 表明正在使用HandlerMethodArgumentResolver 生成自定义对象,该对象拦截一些传入的请求参数并从中创建一个对象。这个概念实际上和 Spring 对@Pageable 所做的一样。

这是我的自定义对象的一部分:

class FlightRequestHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver 
FlightRequestHandlerMethodArgumentResolver() 


@Override
boolean supportsParameter(final MethodParameter parameter) 
    return FlightRequest.class.equals(parameter.getParameterType());


@Override
Object resolveArgument(
        final MethodParameter parameter,
        final ModelAndViewContainer mavContainer,
        final NativeWebRequest webRequest, final WebDataBinderFactory binderFactory) throws Exception 
    final Map<String, String[]> parameterMap = webRequest.getParameterMap()
    // query param names are configurable
    // implementation about finding query param names is ommited
    return new FlightRequest(parameterMap)

FlightRequest类:

public class FlightRequest 

@Parameter(name = "startDate")
private final LocalDate startDate;

@Parameter(name = "endDate")
private final LocalDate endDate;

FlightRequest (LocalDate startDate, LocalDate endDate) 
    this.submissionStartDate = submissionStartDate;
    this.submissionEndDate = submissionEndDate;

使用 FlightRequest 和默认查询参数名称的控制器:

@RequestMapping(value = "/flights", method = RequestMethod.GET)
Flights flights(FlightRequest flightRequest, HttpServletResponse response) 
    return flightSearchService.retrieveFlights(flightRequest);

使用带有自定义查询参数名称的FlightRequest 的控制器:

@RequestMapping(value = "/current-flights", method = RequestMethod.GET)
Flights flights(@FlightRequestParams(fromDateParamName="current-flights-from", toDateParamName="current-flights-till) FlightRequest flightRequest, HttpServletResponse response) 
    return flightSearchService.retrieveFlights(flightRequest);

就像您在上面的示例中看到的那样,每个端点都可以覆盖默认查询参数名称。 如何向Spring Doc 表明这一点?

【问题讨论】:

这个问题已经有一段时间了。请张贴在Springdoc - issues。如果问题已经公开,请务必将其放在问题的 cmets 中。 【参考方案1】:

看来您在这里使用的不是 spring 注释,而是您自己的:@FlightRequestParams。

如果您真的希望动态添加默认值,那么您可以为您的注释DelegatingMethodParameterCustomizer 编写自己的注释,就像为@PageableDefault 所做的那样。 然后将其声明为一个spring Bean,为follow。

或者最简单的方法,就是使用@Parameter注解来声明参数值。可以看PageableAsQueryParam的例子。

【讨论】:

以上是关于Swagger OpenApi 动态查询参数名称使用 Spring 自定义解析器的注释的主要内容,如果未能解决你的问题,请参考以下文章

Swagger/OpenAPI - 使用 $ref 传递可重用的定义参数

OpenAPI-Swagger3-介绍使用

Swagger Editor OpenAPI 3 上的文件上传在尝试时未显示文件浏览器

Swagger 2与OpenAPI 3

Swagger Codegen Maven插件,带有路径变量和请求参数,OpenApi产生不起作用的代码

Unchase OpenAPI (Swagger) Connected Service : 请求的参数设置为 Dictionary<string, string> insted of ID