Swagger的Example Model返回为空

问题描述

问题就是,写好了接口,发现swagger返回的example是空的,这样如果给前端看,那就根本没有数据可以参考。

症状就是这样。

而我想要的结果是

(knife4j和swagger一样)

就是在响应的例子就能看到可能返回的大概样子。

在网上搜了一堆都没有解决方案。

解决方案

问题代码如下

@PostMapping("/authtest")
    @ApiOperation(value = "登录功能测试",response = Result.class)
    @LogMonitorRecord(module = "登录测试", operator = "登录测试")
    @ResponseBody
    public Result<User> loginTest(@RequestBody LoginParam loginParam) {
        return loginService.login(loginParam);
    }

可以看到我指定了返回结果,为什么swagger显示不出来?

user的代码,已经定义了各种swagger注解

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@ApiModel(value = "用户登录的实体dto",description = "用户登录的实体dto")
public class User extends BaseEntity {
    //private static final long serialVersionUID=1L;
    //@TableId(value = "id", type = IdType.AUTO)
    @ApiModelProperty(value = "ID",example = "0")
    private Integer id;

    @ApiModelProperty(value = "用户名",example ="User")
    private String username;

    @ApiModelProperty(value = "密码",example = "password")
    private String password;

    @ApiModelProperty(value = "nickname",example = "nickname")
    private String name;
    /**
     * 用户身份
     */
    @ApiModelProperty(value = "类型",example = "1")
    private String type1;
    public User(String username, String password, String nickname) {
        super();
        this.username = username;
        this.password = password;
        this.name = nickname;

    }
}

核心问题就是,

response = Result.class

这句话是罪魁祸首,把result的返回类型解析为泛型object,而且会直接覆盖掉你自己定义好的那个返回的type。

删掉这句话

    @PostMapping("/authtest")
    @ApiOperation(value = "登录功能测试")
    @LogMonitorRecord(module = "登录测试", operator = "登录测试")
    @ResponseBody
    public Result<User> loginTest(@RequestBody LoginParam loginParam) {
        return loginService.login(loginParam);
    }

 

再次运行swagger

 

完美解决! 

Swagger2默认不支持Map集合的返回,需要自定义配置来解决这个问题。 可以在Swagger2的配置文件中添加一个自定义的Docket Bean,并在该Bean中添加一个自定义的ModelBuilderPlugin,用于处理Map集合的返回值。具体代码如下: ``` @Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.example.controller")) .paths(PathSelectors.any()) .build() .pathMapping("/") .directModelSubstitute(LocalDate.class, String.class) .genericModelSubstitutes(ResponseEntity.class) .apiInfo(apiInfo()) .extensions(Collections.singletonList(new MapModelBuilderPlugin())); } private ApiInfo apiInfo() { return new ApiInfoBuilder().title("API") .description("API reference for developers") .termsOfServiceUrl("http://localhost:8080/") .contact(new Contact("Developers", "http://localhost:8080/", "")) .license("Apache License Version 2.0") .licenseUrl("https://www.apache.org/licenses/LICENSE-2.0") .version("2.0") .build(); } private static class MapModelBuilderPlugin implements ModelBuilderPlugin { @Override public boolean supports(DocumentationType delimiter) { return true; } @Override public void apply(ModelContext modelContext) { ResolvedType type = modelContext.getTypeResolver().resolve(Map.class, WildcardType.class); if (type != null) { ModelReference ref = modelContext.getResolver().resolve(Map.class, WildcardType.class, modelContext.getAlternateTypeProvider()); ModelImpl model = new ModelImpl().type(type); modelContext.getDocumentationType().getModelNames().add(ref.getType().getErasedType().getSimpleName()); modelContext.getAdditionalModels().add(ref.getType().getErasedType(), model); } } } } ``` 其中,MapModelBuilderPlugin用于处理Map集合的返回值,将Map类型转换成ModelImpl类型。在Docket Bean中添加该插件即可解决Map集合返回的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值