首页 > 其他分享 >统一处理返回结果

统一处理返回结果

时间:2022-10-24 19:02:25浏览次数:50  
标签:返回 return 处理 springframework ResponseResultSign org import public 统一


统一处理返回结果

1. 自定义返回结果注解

/**
* 该方法只可以用到类和方法上
* @Author:
* @CreateTime: 2022-3-31 10:42
* @Description: 统一处理返回结果注解
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface ResponseResult {

}

2. 定义一个拦截器

import cn.com.xxx.annotation.ResponseResult;
import cn.com.xxx.oms.constant.ResponseResultSign;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

/**
* @Author:
* @CreateTime: 2022-3-31 10:54
* @Description: 此代码核心思想,就是获取此请求,是否需要返回值包装,设置一个属性标记。
*/
@Component
public class ResponseResultInterceptor implements HandlerInterceptor {


@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
if (handler instanceof HandlerMethod) {
final HandlerMethod handlerMethod= (HandlerMethod) handler;
final Class<?> beanType = handlerMethod.getBeanType();
final Method method = handlerMethod.getMethod();
// 判断是否在对象类上加注解 或 在方法上加这个注解
if (beanType.isAnnotationPresent(ResponseResult.class)) {
// 设置次请求返回体,需要包装往下传递 在 ResponseBodyAdvice 接口进行判断
request.setAttribute(ResponseResultSign.key.getName(),beanType.getAnnotation(ResponseResult.class));
} else if (method.isAnnotationPresent(ResponseResult.class)) {
// 设置次请求返回体,需要包装往下传递 在 ResponseBodyAdvice 接口进行判断
request.setAttribute(ResponseResultSign.key.getName(),method.getAnnotation(ResponseResult.class));
}
}
return true;
}
}

3. 注册拦截器

import cn.com.xxx.sys.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
* 参数解析器 配置信息
* @author
* @create 2020-06-18 17:08
*/
@Configuration
public class ArgumentResolverConfig implements WebMvcConfigurer {

/**
* 需要手动添加拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
ResponseResultInterceptor interceptor = new ResponseResultInterceptor();
registry.addInterceptor(interceptor);
WebMvcConfigurer.super.addInterceptors(registry);
}
}

4. 响应方法 处理器

import cn.com.xxx.annotation.ResponseResult;
import cn.com.xxx.oms.constant.ResponseResultSign;
import cn.com.xxx.result.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import javax.servlet.http.HttpServletRequest;

/**
* @Author:
* @CreateTime: 2022-3-31 11:15
* @Description:
*/
@Slf4j
@ControllerAdvice
public class ResponseResultHandler implements ResponseBodyAdvice<Object> {


/**
* 是否请求 包含了 包装注解 标记 ,没有直接返回 不需要重写返回体
* @param methodParameter
* @param aClass
* @return
*/
@Override
public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
// 判断是否有包装标记 ResponseResultSign.key.getName()
ResponseResult responseResult = (ResponseResult)request.getAttribute(ResponseResultSign.key.getName());
return responseResult == null ? false : true;
}

@Override
public Object beforeBodyWrite(Object body, MethodParameter methodParameter, MediaType mediaType,
Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
ServerHttpResponse serverHttpResponse) {
log.info("responseResultHandler.beforeBodyWrite:{}","进去返回体,重写格式,处理中!");
// if (body instanceof ErrorResult) { } 对于异常类的处理

return JsonResult.ok(body);
}
}

5. 请求的key

/**
* @Author:
* @CreateTime: 2022-3-31 15:35
* @Description: 返回接口的标识
*/
public enum ResponseResultSign implements EnumMessage {

key(1,"RESPONSE_RESULT");

private int code;

private String name;

ResponseResultSign() {
}

ResponseResultSign(int code, String name) {
this.code = code;
this.name = name;
}


@Override
public int getCode() {
return this.code;
}
@Override
public String getName() {
return this.name;
}

public static String getNameByCode(Integer code) {
ResponseResultSign[] values = ResponseResultSign.values();
for (ResponseResultSign type : values) {
if (type.getCode() == code) {
return type.getName();
}
}
return "";
}

public static String getByName(Integer code) {
ResponseResultSign[] values = ResponseResultSign.values();
for (ResponseResultSign type : values) {
if (type.getCode() == code) {
return type.getName();
}
}
return null;
}

public static ResponseResultSign getByCode(int code) {
ResponseResultSign[] values = ResponseResultSign.values();
for (ResponseResultSign type : values) {
if (type.getCode() == code) {
return type;
}
}
return null;
}
}

6 封装的返回结果

@Data
public class JsonResult<T> {

private int status;

private String msg;

private T data;

public static <T> JsonResult<T> ok(T data) {
JsonResult<T> result = new JsonResult<>();
result.setStatus(HttpStatus.OK.value());
result.setMsg(HttpStatus.OK.getReasonPhrase());
result.setData(data);
return result;
}

public static <T> JsonResult<T> ok() {
return ok(null);
}

public static <T> JsonResult<T> err(T data) {
JsonResult<T> result = new JsonResult<>();
result.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
result.setMsg(HttpStatus.INTERNAL_SERVER_ERROR.getReasonPhrase());
result.setData(data);
return result;
}

@JsonGetter
public long getTimestamp() {
return System.currentTimeMillis();
}
}
7 测试返回结果
@ResponseResult
@RequestMapping(value = "/sso")
public ResponseEntity sso(@RequestParam("AUTH_TICKET") String authTicket) {
if (StringUtils.isBlank(authTicket)) {
throw new BusinessException("AUTH_TICKET 不能为空!");
}
authTicket = authTicket.replaceAll(StringPool.SPACE, StringPool.PLUS);
return authTicket;
}
{
"status": 200,
"msg": "OK",
"data": {
"result": "error",
"info": "凭证过期!"
},
"timestamp": 1648710789855
}


标签:返回,return,处理,springframework,ResponseResultSign,org,import,public,统一
From: https://blog.51cto.com/u_4981212/5790943

相关文章