Springboot(HandlerMethodReturnValueHandler使用) 自定义注解处理返回值

在我们开发接口的时候我想到大多数接口都需要返回如下格式

{
    "code""200",
    "data":"",
    "msg""success"
}

大多人的做法其实很简单,但是也很冗余

开发一个 ResponseResult,然后返回对象用这个对象包起来,大概长这么个样子

 @GetMapping("/test")
    public ResponseResult test() {
    List<Student> students;
 ResponseUtils.success(students)
 }

而 ResponseResult 中则是如下代码

return new ResponseResult(ErrorCodeConstants.SUCCESS, null, data);

@Data
@AllArgsConstructor
public  class ResponseResult<T{
    private Integer code;
    private String msg;
    private T data;

    public boolean success() {
        return this.code == ResultCodeMeg.SUCCESS.getCode();
    }
}

每次返回我们都需要去调用 ResponseUtils.success方法,有没有办法干掉这个方法直接返回我们数据类 students,而要求满足前端的呢,我们可以基于 HandlerMethodReturnValueHandler 来实现

首先自定义一个返回注解

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZouResponseBody {
 //序列化方式
    SerializerFeature[] serializerFeature() default {};
}

ps 这里依赖了 fastjson

在自定义返回类

  • ZouBaseResponse.class
@Data
public class ZouBaseResponse implements Serializable {
    private String code;
    private String msg;
    private Object data;
}

自定义 返回值处理配置类 实现 HandlerMethodReturnValueHandler接口

  • ZouResponseBodyHandleReturnValue.class
public class ZouResponseBodyHandleReturnValue implements HandlerMethodReturnValueHandlerAsyncHandlerMethodReturnValueHandler {


    @Override
    public boolean isAsyncReturnValue(Object returnValue, MethodParameter returnType) {
        return supportsReturnType(returnType);
    }
 
 // 如果被 ZouResponseBody.class 注解修饰则处理
    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        return returnType.getParameterType() != ZouBaseResponse.class
                && !ObjectUtils.isEmpty(returnType.getAnnotatedElement().getAnnotation(ZouResponseBody.class))
;

    }
 
 // 返回值封装
    @Override
    public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
        mavContainer.setRequestHandled(true);
        HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
        assert response != null;
        response.setContentType("application/json;charset=utf-8");
        ZouBaseResponse baseResponse = new ZouBaseResponse();
        baseResponse.setCode("200");
        baseResponse.setMsg("success");
        baseResponse.setData(returnValue);
        ZouResponseBody responseBody = returnType.getAnnotatedElement().getAnnotation(ZouResponseBody.class);
        SerializerFeature[] defaultSerializerFeature = {
                SerializerFeature.DisableCircularReferenceDetect
        };
        /**
         * 替换注解中的序列化格式
         */

        if (!ObjectUtils.isEmpty(responseBody) && !ObjectUtils.isEmpty(responseBody.serializerFeature())) {
            defaultSerializerFeature = responseBody.serializerFeature();
        }
        response.getWriter().write(JSON.toJSONString(baseResponse, defaultSerializerFeature));

    }
}

定义一个WebMVC 配置类 加入自定义的处理器 ZouResponseBodyHandleReturnValue

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
        returnValueHandlers.add(new ZouResponseBodyHandleReturnValue());
    }
}

使用测试

@RestController
@RequestMapping("/user")
public class UserController {

    @ZouResponseBody
    @GetMapping("/user")
    public List<Student> getUsers() {
        Student student = new Student();
        student.setName("小奏");
        student.setAge(22);
        Student student1 = new Student();
        student.setName("小明");
        student.setAge(23);
        return Lists.newArrayList(student, student1);
    }

}

返回结果Springboot(HandlerMethodReturnValueHandler使用) 自定义注解处理返回值

使用起来要比原先的那种方式更为简洁


原文始发于微信公众号(小奏技术):Springboot(HandlerMethodReturnValueHandler使用) 自定义注解处理返回值

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/30499.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!