<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();}}