Spring MVC中如何让Swagger UI隐藏RequestBody包装类展示
解决Swagger UI隐藏包装类、仅展示MyClass数组结构的问题
以下是几种可行的实现方案:
方案1:通过@Schema注解直接指定请求体类型
修改接口方法的@RequestBody参数注解,强制Swagger将请求体识别为MyClass数组,同时隐藏包装类的单独定义:
步骤1:修改接口方法
@PostMapping("/api/create") public void create( @ApiParam(required = true) @RequestBody @Schema(type = "array", implementation = MyClass.class) MyClassWrapper wrapped) { // 业务逻辑 }
步骤2:修改包装类的@Schema注解
@Builder(toBuilder = true) @Data @Jacksonized @Schema(name = "MyClassWrapper", hidden = true) public class MyClassWrapper { @ArraySchema(schema = @Schema(implementation = MyClass.class)) private List<MyClass> myClasses; }
方案2:自定义Swagger模型转换器(全局生效)
如果有多个类似包装类需要处理,可以实现ModelConverter接口,在Swagger构建模型时自动将包装类替换为内部的数组类型:
@Component public class WrapperModelConverter implements ModelConverter { @Override public Schema resolve(ModelConverterContext context, AnnotatedType type, Iterator<ModelConverter> chain) { // 匹配目标包装类 if (type.getType() == MyClassWrapper.class) { // 构建MyClass数组的Schema Schema myClassSchema = context.resolve(AnnotatedType.of(MyClass.class)); return new ArraySchema().items(myClassSchema); } return chain.hasNext() ? chain.next().resolve(context, type, chain) : null; } }
方案3:使用@ApiImplicitParam指定请求体结构
直接在接口方法上通过@ApiImplicitParam声明请求体为MyClass数组,忽略包装类的展示:
@PostMapping("/api/create") @ApiImplicitParams({ @ApiImplicitParam( name = "body", required = true, dataType = "MyClass", paramType = "body", allowMultiple = true ) }) public void create(@RequestBody MyClassWrapper wrapped) { // 业务逻辑 }
内容的提问来源于stack exchange,提问作者hideous
相关产品推荐
相关产品推荐

