这是因为若依框架自带的通用返回对象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可以正常解析结果数据.