766 Star 6.6K Fork 1.4K

GVP萧明 / knife4j

 / 详情

使用@Content导致泛型object

待办的
创建于  
2024-04-17 15:23

版本信息`

        <groupId>com.github.xiaoymin</groupId>
        <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
        <version>4.5.0</version>
    </dependency>`

springboot3.2.4 jdk17

/**
     * @❤️❤️笑对人生,风雨皆成诗。
     * @日期: 2024/4/16 11:00
     * @描述: 测试返回值
     */
    @Operation(
            summary = "测试3",
            description = "根据请求头用于测试",
            parameters = {
                    @Parameter(name = "name", description = "名称"),
                    @Parameter(name = "age", description = "年纪"),
            },
            responses = {
                    @ApiResponse(
                            responseCode = "0",
                            description = "成功",
                            content = {
                                    @Content(
                                            mediaType = "application/json",
                                            schema = @Schema(implementation = R.class, exampleClasses=TestVo.class)
                                    )
                            }
                    )
            }
    )
    @PostMapping("/testReturn3")
    public TestVo testReturn3(@Length(min = 2, max = 4, message = "名称2-4长度") @RequestParam("name") String name, @Min(value = 10, message = "年龄最少为10") @RequestParam("age") String age) {
        TestVo testVo = new TestVo();
        return testVo;
    }

全局使用了统一返回结果值,

package com.panda.cn.config.ReturnValue;

import com.panda.cn.utils.result.R;
import org.springframework.core.MethodParameter;
import org.springframework.core.env.Environment;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.async.StandardServletAsyncWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.method.support.ModelAndViewContainer;

/**
 * 处理程序返回值
 *
 * @author Yanmh
 * @date 2022/09/13
 */
public class ReturnValueHandler implements HandlerMethodReturnValueHandler {
    
    private  Environment env;
    
    
    /**
     * 处理程序方法返回值处理程序
     */
    private final HandlerMethodReturnValueHandler handlerMethodReturnValueHandler;
    
    /**
     * 处理程序返回值
     *
     * @param handlerMethodReturnValueHandler 处理程序方法返回值处理程序
     */
    public ReturnValueHandler(HandlerMethodReturnValueHandler handlerMethodReturnValueHandler, Environment env){
        this.handlerMethodReturnValueHandler = handlerMethodReturnValueHandler;
        this.env = env;
    }
    
    /**
     * 支持返回类型
     *
     * @param methodParameter 方法参数
     * @return boolean
     */
    @Override
    public boolean supportsReturnType(MethodParameter methodParameter) {
        return this.handlerMethodReturnValueHandler.supportsReturnType(methodParameter);
    }
    
    /**
     * 处理返回值
     *
     * @param returnValue           返回值
     * @param methodParameter       方法参数
     * @param modelAndViewContainer 模型和视图容器
     * @param nativeWebRequest      本地web请求
     * @throws Exception 异常
     */
    @Override
    public void handleReturnValue(Object returnValue, MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest) throws Exception {
        // 判断外层是不是由封装的进行返回
        if(returnValue instanceof R) {
            this.handlerMethodReturnValueHandler.handleReturnValue(returnValue, methodParameter, modelAndViewContainer, nativeWebRequest);
            return;
        }
        // 获取请求地址
        String servletPath = ((StandardServletAsyncWebRequest) nativeWebRequest).getRequest().getServletPath();
        String docPath = env.getProperty("springdoc.api-docs.path");
        if (servletPath.startsWith(docPath)) {
            this.handlerMethodReturnValueHandler.handleReturnValue(returnValue, methodParameter, modelAndViewContainer, nativeWebRequest);
            return;
        }
        
        this.handlerMethodReturnValueHandler.handleReturnValue(R.success().data(returnValue), methodParameter, modelAndViewContainer, nativeWebRequest);
    }
}

统一返回类为R

package com.panda.cn.utils.result;


import com.fasterxml.jackson.annotation.JsonInclude;
import com.panda.cn.model.vo.TestVo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import java.io.Serializable;

/**
 * @author: Mr.Yan
 * @create: 2020/10/21
 * @description: 返回结果集统一封装
 */
//@Schema(description = "响应")
public class R<T extends Object> implements Serializable {
    private static final long serialVersionUID = 1L;
    
    /**
     * 返回操作码(默认为正常)
     */
    @Schema(description = "状态码(0:成功, -1:失败)")
    private Integer code = RCodeEnum.SUCCESS.code();
    
    /**
     * 返回正确消息信息
     */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @Schema(description = "成功消息")
    private String msg = "";
    
    /**
     * 返回错误的消息信息
     */
    @JsonInclude(JsonInclude.Include.NON_EMPTY)
    @Schema(description = "失败消息")
    private String error = "";
    
    /**
     * 返回数据信息
     */
    @Schema(description = "响应数据")
    private T data;
    
    public static R success() {
        return new R().code(RCodeEnum.SUCCESS).msg(RCodeEnum.SUCCESS.msg());
    }
    
    public static R fail() {
        return new R().code(RCodeEnum.FAIL).error(RCodeEnum.FAIL.msg());
    }
    
    // 构造方法
    public static R build() {
        return new R();
    }
    
    public static <T> R<T> build(T data) {
        return new R().data(data);
    }
    
    // 赋值方法
    public R<T> data(T data) {
        this.data = data;
        return this;
    }
    
    public R code(RCodeEnum enmu) {
        this.code = enmu.code();
        return this;
    }
    
    public R msg(String msg) {
        this.msg = msg;
        return this;
    }
    
    public R error(String error) {
        this.error = error;
        return this;
    }
    
    public Integer getCode() {
        return code;
    }
    
    public T getData() {
        return data;
    }
    
    public String getMsg() {
        return msg;
    }
    
    public String getError() {
        return error;
    }
    
    
}


TestVo类

@Schema(description = "测试返回")
public class TestVo {
    
    @Schema(description = "名称", defaultValue = "张三")
    private String name;
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
}

输入图片说明
object 能为未TestVo类

评论 (0)

闫先生 创建了任务

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(1)
2033230 yxs2615 1578964705
Java
1
https://gitee.com/xiaoym/knife4j.git
git@gitee.com:xiaoym/knife4j.git
xiaoym
knife4j
knife4j

搜索帮助