如何在Swagger UI中正确使用@RequestParam Map<String,String>去除参数前缀?
解决SpringFox Swagger UI中Map类型请求参数带前缀的问题
方案一:自定义Swagger参数处理插件
通过实现SpringFox的ParameterBuilderPlugin接口,修改Map类型参数的Swagger元数据,让其生成不带前缀的独立查询参数:
- 创建自定义插件类:
import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import springfox.documentation.builders.ParameterBuilder; import springfox.documentation.schema.ModelRef; import springfox.documentation.service.Parameter; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.ParameterBuilderPlugin; import springfox.documentation.spi.service.contexts.ParameterContext; import java.util.Map; @Component @Order(value = 1) public class MapParameterPlugin implements ParameterBuilderPlugin { @Override public void apply(ParameterContext context) { Class<?> paramType = context.resolvedMethodParameter().getParameterType(); // 判断是否为Map类型 if (Map.class.isAssignableFrom(paramType)) { // 清空参数名避免生成前缀,将Map拆分为多个动态查询参数 ParameterBuilder builder = context.parameterBuilder(); builder.name("") .modelRef(new ModelRef("string")) .allowMultiple(true) .parameterType("query") .description("动态查询参数"); } } @Override public boolean supports(DocumentationType documentationType) { return true; } }
- 确保Spring能扫描到该组件,可将其放在Swagger配置类所在包下,或通过
@ComponentScan指定扫描路径。
方案二:使用@ApiImplicitParams声明参数(适用于已知键名场景)
如果Map对应的参数键名固定,可直接通过Swagger注解手动声明参数,避免自动生成带前缀的格式:
@GetMapping(value = "") @ApiImplicitParams({ @ApiImplicitParam(name = "additionalProp1", value = "参数1", paramType = "query", dataType = "string"), @ApiImplicitParam(name = "additionalProp2", value = "参数2", paramType = "query", dataType = "string") }) public String Hello(@RequestParam Map<String, String> params) { // 业务逻辑实现 return "Hello"; }
这种方式下,Swagger UI会生成不带前缀的独立查询参数输入框,测试时将直接生成?additionalProp1=xxx&additionalProp2=xxx格式的请求串。
补充说明
- 方案一适配动态不确定键名的Map参数,能自动兼容任意键值对;
- 方案二更适合参数键名固定的场景,参数说明更清晰,可读性更强。
内容的提问来源于stack exchange,提问作者troy
相关产品推荐
相关产品推荐

