顾名思义,就是统一修改某些接口的返回值。在这之前,我们可能会发现我们的controller中有以下代码:
其中的BaseResult是基础的返回值,里面有errorCode、errorMsg和body属性,可能大部分接口都是这种返回值类型,然后我们需要在每个接口中手动捕捉异常,手动设置errorCode、errorMsg和body,这样我们就做了很多的重复工作,其实可以简化这些操作的,只需要下面几步就可以了:
第一、建立返回结果处理类
import java.lang.reflect.Method;
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.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import com.xxx.blog.annotation.SysLog;
import com.xxx.blog.result.BaseResult;
@RestControllerAdvice
public class ResultHandler implements ResponseBodyAdvice<Object>{
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
Method method = returnType.getMethod();
SysLog sysLog = method.getAnnotation(SysLog.class);
if(sysLog != null) {
// 只处理含有SysLog注解的方法
return true;
}
return false;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
ServerHttpResponse response) {
// 修改返回值类型
BaseResult result = new BaseResult();
result.setBody(body);
return result;
}
}
第二步、建立异常处理类
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
// 业务异常处理方法
@ExceptionHandler(value = CommonException.class)
public Object CommonException(HttpServletRequest request, CommonException e, HandlerMethod handlerMethod) {
log.error("业务处理不成功,错误信息为: {}", e.getMessage());
Method method = handlerMethod.getMethod();
if(method.getReturnType().equals(ModelAndView.class)) {
String view = (String) request.getAttribute(SessionKey.ERROR_RETURN_PAGE);
if(StringUtil.isNullOrEmpty(view)) {
view = "/index";
}
return new ModelAndView(view);
}
return new BaseResult(e);
}
// 服务器异常处理方法
@ExceptionHandler(value = Exception.class)
public Object exception(HttpServletRequest request, Exception e, HandlerMethod handlerMethod) {
log.error("服务器发生异常,异常信息为", e);
Method method = handlerMethod.getMethod();
if(method.getReturnType().equals(ModelAndView.class)) {
String view = (String) request.getAttribute(SessionKey.ERROR_RETURN_PAGE);
if(StringUtil.isNullOrEmpty(view)) {
view = "/index";
}
return new ModelAndView(view);
}
return new BaseResult("服务器内部发生异常");
}
}
这个时候我们的接口只需要这样写就可以了
@RequestMapping("/editor")
@SysLog("编辑留言")
public void editor(Feedback feedback) throws CommonException{
if(feedback == null || StringUtil.isNullOrEmpty(feedback.getContent())) {
throw new CommonException("留言内容不能为空");
}
feedbackService.editor(feedback, null);
}
如果需要往BaseResult的body中设置值,则可写成:
@RequestMapping("/editor")
@SysLog("查询留言")
public Feedback editor(String id) throws CommonException {
if(StringUtil.isNullOrEmpty(id)) {
throw new CommonException("留言id不能为空");
}
return feedbackService.findById(id);
}
是不是发现简单多了呢?