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



我试图弄清楚如何向SpringDocOpenApi指示正在使用HandlerMethodArgumentResolver生成自定义对象,该拦截了一些传入的请求参数并从中创建对象。这个概念实际上和春天对@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表明这一点?

您似乎在这里使用的不是弹簧注释,而是您自己的注释:@FlightRequestParams。

如果您确实希望动态添加默认值,那么您可以为您的注释编写自己的注释 DemissionatingMethodParameterCustomizer,就像为@PageableDefault编写一样。 然后声明为春豆,如下所示。

或者最简单的方法是使用@Parameter注释声明参数值。您可以看到PageableAsQueryParam的示例。

最新更新