若依框架在swagger文档中无法显示响应参数和响应示例的问题

文章讲述了若依框架的AjaxResult由于继承自HashMap导致与Swagger和knife4j不兼容的问题,提出通过修改最小方案以保持接口兼容性,但最终选择替换返回值类型为R以解决Swagger解析问题,减少整体改动量。
摘要由CSDN通过智能技术生成

在这里插入图片描述这是因为若依框架自带的通用返回对象AjaxResult是继承与HashMap的,swagger和knife4j无法解析hashmap这种未确定对象,参考内容https://doc.xiaominfo.com/docs/faq/swagger-des-not-found.
要解决的话需要修改AjaxResult对象,这里采用修改最小的方案,因为改动大了的话若依自带的很多接口会报错,修改量太大.
@Data
public class AjaxResult implements Serializable {
private static final long serialVersionUID = 1L;

/**
 * 是否成功 true or false
 */
private boolean success;

/**
 * 状态码
 */
private int code;

/**
 * 返回内容
 */
private String msg;

/**
 * 数据对象
 */
private T data;

public <U> AjaxResult(Type type, int msg, U data) {

}

/**
 * 状态类型
 */
public enum Type
{
    /** 成功 */
    SUCCESS(0),
    /** 警告 */
    WARN(301),
    /** 错误 */
    ERROR(500);
    private final int value;

    Type(int value)
    {
        this.value = value;
    }

    public int value()
    {
        return this.value;
    }
}

/**
 * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
 */
public AjaxResult()
{
}

/**
 * 初始化一个新创建的 AjaxResult 对象
 *
 * @param type 状态类型
 * @param msg 返回内容
 * @param data 数据对象
 */
public AjaxResult(Type type, String msg, T data) {
    this.code = type.value();
    this.msg = msg;
    if (StringUtils.isNotNull(data)) {
        this.data = data;
    }

    if (type.value == Type.SUCCESS.value) {
        this.success = Boolean.TRUE;
    } else {
        this.success = Boolean.FALSE;
    }
}
    /**
 * 状态码
 */
public static final String CODE_TAG = "code";

/**
 * 返回内容
 */
public static final String MSG_TAG = "msg";

/**
 * 数据对象
 */
public static final String DATA_TAG = "data";

/**
 * 返回成功消息
 *
 * @return 成功消息
 */
public static AjaxResult success()
{
    return AjaxResult.success("操作成功");
}

/**
 * 返回成功数据
 *
 * @return 成功消息
 */
public static <U> AjaxResult<U> success(U data)
{
    return AjaxResult.success("操作成功", data);
}

/**
 * 返回成功消息
 *
 * @param msg 返回内容
 * @return 成功消息
 */
public static AjaxResult success(String msg)
{
    return AjaxResult.success(msg, null);
}

/**
 * 返回成功消息
 *
 * @param msg 返回内容
 * @param data 数据对象
 * @return 成功消息
 */
public static <U> AjaxResult<U> success(String msg, U data)
{
    return new AjaxResult(Type.SUCCESS, msg, data);
}

/**
 * 返回警告消息
 *
 * @param msg 返回内容
 * @return 警告消息
 */
public static AjaxResult warn(String msg)
{
    return AjaxResult.warn(msg, null);
}

/**
 * 返回警告消息
 *
 * @param msg 返回内容
 * @param data 数据对象
 * @return 警告消息
 */
public static <U> AjaxResult<U> warn(String msg, U data)
{
    return new AjaxResult(Type.WARN, msg, data);
}

/**
 * 返回错误消息
 *
 * @return
 */
public static AjaxResult error()
{
    return AjaxResult.error("操作失败");
}

/**
 * 返回错误消息
 *
 * @param msg 返回内容
 * @return 警告消息
 */
public static AjaxResult error(String msg)
{
    return AjaxResult.error(msg, null);
}

/**
 * 返回错误消息
 *
 * @param msg 返回内容
 * @param data 数据对象
 * @return 警告消息
 */
public static <U> AjaxResult<U> error(String msg, U data)
{
    return new AjaxResult(Type.ERROR, msg, data);
}
public static <U> AjaxResult<U> error(int msg, U data)
{
    return new AjaxResult(Type.ERROR, msg, data);
}


/**
 * 方便链式调用
 *
 * @param key 键
 * @param value 值
 * @return 数据对象
 */
@Deprecated
public AjaxResult put(String key, Object value) {

//super.put(key, value);
return this;
}

/**
 * 是否为成功消息
 *
 * @return 结果
 */
public boolean isSuccess() {
    return success;
}

public String getMsg() {
    return msg;
}

public Integer getCode() {
    return code;
}

}

然后还需要带上泛型,如果是分页的就加上分页,比如

    @PostMapping("/list")
    @ApiOperation("客户列表")
    public AjaxResult<Page<ClientListVO>> publicList(@RequestBody ClientPublicRequest request) {
        return clientService.publicList(request);
    }
    @GetMapping("/detail")
    @ApiOperation("客户详情")
    public AjaxResult<ClientDetailVO> detail(@RequestParam Long id) {
        return clientService.detail(id);
    }

这样就可以了,最终效果
在这里插入图片描述
在这里插入图片描述
话说回来 这是若依框架的第多少个坑了?

后续更新:在跟前端对接的过程中又发现了新的问题,很多框架自带的接口都使用了AjaxResult里面的map功能,比如login的token是放在里面,getInfo的User信息也是放在里面,这么修改会导致这些接口前端全都无法获取到数据.进一步处理方案是在AJaxResult里面再放入一个map,但是前端说依然不行,改变了获取的格式,要修改的地方太多.
最终方案是把所有自己写的接口的返回值从AjaxResult更换为R,使用R.ok和R.fail方法来返回,就解决了问题,因为Rbingmy像AjaxResult那样继承HashMap,swagger可以正常解析结果数据.

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值