在我们开发接口的时候我想到大多数接口都需要返回如下格式
{
"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 HandlerMethodReturnValueHandler, AsyncHandlerMethodReturnValueHandler {
@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使用) 自定义注解处理返回值
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/30499.html