当前位置:   article > 正文

SpringController返回值和异常自动包装

SpringController返回值和异常自动包装

今天遇到一个需求,在不改动原系统代码的情况下。将Controller的返回值和异常包装到一个统一的返回对象中去。

例如原系统的接口

public String myIp(@ApiIgnore HttpServletRequest request);

返回的只是一个IP字符串"0:0:0:0:0:0:0:1",目前接口需要包装为:

{"code":200,"message":"","result":"0:0:0:0:0:0:0:1","success":true}

而原异常跳转到error页面,需要调整为

{
  "success": false,
  "message": "For input string: \"fdsafddfs\"",
  "code": 500,
  "result": "message"
}

因此就有了2个工作子项需要完成:

1)Exception的处理

2)controller return值的处理

Exception的自动包装

返回的exception处理可以采用@RestControllerAdvice来处理。

建立自己的Advice类,注入国际化资源(异常需要支持多语言)
 

  1. package org.ccframe.commons.mvc;
  2. import lombok.extern.log4j.Log4j2;
  3. import org.apache.commons.lang3.StringUtils;
  4. import org.apache.http.HttpStatus;
  5. import org.ccframe.commons.filter.CcRequestLoggingFilter;
  6. import org.ccframe.commons.util.BusinessException;
  7. import org.ccframe.config.GlobalEx;
  8. import org.ccframe.subsys.core.dto.Result;
  9. import org.springframework.context.MessageSource;
  10. import org.springframework.context.NoSuchMessageException;
  11. import org.springframework.core.MethodParameter;
  12. import org.springframework.http.ResponseEntity;
  13. import org.springframework.orm.ObjectOptimisticLockingFailureException;
  14. import org.springframework.web.HttpRequestMethodNotSupportedException;
  15. import org.springframework.web.bind.annotation.*;
  16. import org.springframework.web.context.request.NativeWebRequest;
  17. import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
  18. import org.springframework.web.method.support.ModelAndViewContainer;
  19. import org.springframework.web.multipart.MaxUploadSizeExceededException;
  20. import org.springframework.web.servlet.LocaleResolver;
  21. import org.springframework.web.servlet.NoHandlerFoundException;
  22. import javax.servlet.http.HttpServletRequest;
  23. import java.util.Locale;
  24. @RestControllerAdvice
  25. @Log4j2
  26. public class GlobalRestControllerAdvice{
  27. private MessageSource messageSource; //国际化资源
  28. private LocaleResolver localeResolver;
  29. private Object[] EMPTY_ARGS = new Object[0];
  30. public GlobalRestControllerAdvice(MessageSource messageSource, LocaleResolver localeResolver){
  31. this.messageSource = messageSource;
  32. this.localeResolver = localeResolver;
  33. }
  34. private Result<String> createError(HttpServletRequest request, Exception e,int code, String msgKey, Object[] args){
  35. Locale currentLocale = localeResolver.resolveLocale(request);
  36. String message = "";
  37. try {
  38. message = messageSource.getMessage(msgKey, args, currentLocale);
  39. }catch (NoSuchMessageException ex){
  40. message = e.getMessage();
  41. }finally {
  42. log.error(message);
  43. CcRequestLoggingFilter.pendingLog(); //服务器可以记录出错时的请求啦
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/229669
    推荐阅读
    相关标签