结果演示:
1.引入依赖:
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.5.Final</version>
</dependency>
2.新建枚举类型的响应码:
public enum ResultCode {
SUCCESS(1000, "操作成功"),
FAILED(1001, "响应失败"),
VALIDATE_FAILED(1002, "参数校验失败"),
PERMISSION_FAILED(1003, "权限获取失败"),
ERROR(5000, "未知错误");
private int code;
private String msg;
ResultCode(int code, String msg) {
this.code = code;
this.msg = msg;
}
//省略getter,setter
}
3.新建包装类:
public class ResultVO<T> {
private int code;
private String msg;
private T data;
public ResultVO(T data) {
this(ResultCode.SUCCESS, data);
}
public ResultVO(ResultCode resultCode, T data) {
this(resultCode.getCode(),resultCode.getMsg(),data);
}
public ResultVO(int code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
//省略getter,setter
}
4.自定义异常并对异常进行处理:
public class APIException extends RuntimeException {
private int code;
private String msg;
public APIException() {
this(1001, "接口错误");
}
public APIException(String msg) {
this(1001, msg);
}
public APIException(int code, String msg) {
super(msg);
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
@ControllerAdvice
public class ExceptionControllerAdvice {
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultVO<String> MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
// 从异常对象中拿到ObjectError对象
ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
// 然后提取错误提示信息进行返回
return new ResultVO<>(ResultCode.VALIDATE_FAILED,objectError.getDefaultMessage()) ;
}
@ExceptionHandler(APIException.class)
public ResultVO<String> APIExceptionHandler(APIException e){
return new ResultVO<>(ResultCode.FAILED ,e.getMsg());
}
}
5.对返回结果进行包装:
@ControllerAdvice(basePackages = {"com.example.template.Controller"}) // 注意哦,这里要加上需要扫描的包
public class ResponseControllerAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> aClass) {
// 如果接口返回的类型本身就是ResultVO那就没有必要进行额外的操作,返回false
return !returnType.getGenericParameterType().equals(ResultVO.class);
}
@Override
public Object beforeBodyWrite(Object data, MethodParameter returnType, MediaType mediaType, Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest request, ServerHttpResponse response) {
return new ResultVO<>(data);
}
@ExceptionHandler(Exception.class)
@ResponseBody
public ResultVO<String> ExceptionHandler(Exception e){
return new ResultVO<>(ResultCode.FAILED ,e.getMessage());
}
}
6.对返回类型为String的进行处理,优先使用json转换
@Configuration
public class configuration implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(0, new MappingJackson2HttpMessageConverter());
}
}
7.新建测试的类:
public class User extends User {
@NotNull
@Size(min = 3,max=11)
private String username;
@NotNull
@Size(min = 3,max=11)
private String password;
//getter,setter...
}
8.在Controller中进行测试:
@RequestMapping("test")
@ResponseBody
public String test(User user){
if(user.username.equals("a"))
throw new APIException("测试异常");
return "test";
}