<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 保證 Spring AOP 相關的依賴包 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency>
異常配置 統一攔截
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;@ControllerAdvice(basePackages = "com.gouying.demos.web")
public class GlobalExceptionHandler {private Logger logger = LoggerFactory.getLogger(getClass());/*** 處理 MissingServletRequestParameterException 異常** SpringMVC 參數不正確*/@ResponseBody@ExceptionHandler(value = MethodArgumentNotValidException.class)public Object missingServletRequestParameterExceptionHandler(HttpServletRequest req, MethodArgumentNotValidException ex) {logger.debug("[missingServletRequestParameterExceptionHandler]", ex);StringBuilder detailMessage = new StringBuilder();for (ObjectError objectError : ex.getAllErrors()) {// 使用 ; 分隔多個錯誤if (detailMessage.length() > 0) {detailMessage.append(";");}// 拼接內容到其中detailMessage.append(objectError.getDefaultMessage());}System.out.println(detailMessage);// 包裝 CommonResult 結果return detailMessage;}}
這個類可以處理返回值
- 不是Result類的返回Result
- 想要更改數據這里也可以
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;// 只攔截我們的 Controller 所在包,避免其它類似 swagger 提供的 API 被切面攔截
@ControllerAdvice(basePackages = "com.gouying.demos.web")
public class GlobalResponseBodyHandler implements ResponseBodyAdvice {@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType,ServerHttpRequest request, ServerHttpResponse response) {// 如果已經是 CommonResult 類型,則直接返回System.out.println(String.valueOf(body));// 如果不是,則包裝成 CommonResult 類型return "success";}}
controller
@Validated
@Controller
public class BasicController {// curl -H "Content-Type: application/json" -X POST -d '{"name":"123"}' "http://127.0.0.1:8888/hello"@PostMapping("/hello")@ResponseBodypublic String hello(@Valid @RequestBody User user) {return user.getName();}}