<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 {@Override public boolean supports(MethodParameter returnType, Class converterType) { return true; } @Override public 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")
@ResponseBody
public String hello(@Valid @RequestBody User user) {
return user.getName();
}
}