2023年11月29日发(作者:)

SpringMVCController返回值及异常的统⼀处理⽅法

旧的设计⽅案

开发api的时候,需要先定义好接⼝的数据响应结果.如下是⼀个很简单直接的Controller实现⽅法及响应结果定义.

@RestController

@RequestMapping("/users")

public class UserController {

@Inject

private UserService userService;

@GetRequest("/{userId:d+}")

public ResponseBean signin(@PathVariable long userId) {

try {

User user = rBaseInfo(userId);

return s(user);

} catch (ServiceException e) {

return new ReponseBean(e(), ());

} catch (Exception e) {

return Error();

}

}

}

{

code: "",

data: {}, // 可以是对象或者数组

msg: ""

}

从上⾯的代码,我们可以看到对于每个 Controller ⽅法,都会有很多重复的代码出现,我们应该设法去避免重复的代码。将重

} else {

// 所有没有返回 ResponseBean 结构的结果均认为是成功的

return s(body);

}

}

}

统⼀异常处理

如下的代码中,均为⾃定义类。

ServiceException ServiceMessageException ValidatorErrorType FieldValidatorError

@ControllerAdvice

}

FieldValidatorError fieldNotValidError = new FieldValidatorError();

// e((straintDescriptor().getAnnotation().annotationType()));

e(());

ld(e());

sage(sage());

return fieldNotValidError;

}

private FieldValidatorError toFieldValidatorError(FieldError error) {

FieldValidatorError fieldNotValidError = new FieldValidatorError();

e(());

ld(ld());

sage(aultMessage());

return fieldNotValidError;

}

/**

* BindException: 数据绑定异常,效果与MethodArgumentNotValidException类似,为MethodArgumentNotValidException的⽗类

*/

@ExceptionHandler()

(ex);

String message = "Problems parsing JSON";

return new ResponseBean(_(), message);

}

/**

* 将返回的结果转化到响应的数据时候导致的问题。

*/

@ExceptionHandler()

public ResponseBean exceptionHandle(HttpServletRequest request, NoHandlerFoundException ex) {

(ex);

String message = "No resource found for " + pMethod() + " " + uestURL();

return new ResponseBean(_(), message);

}

/**

* 缺少路径参数

* Controller⽅法中定义了 @PathVariable(required=true) 的参数,但是却没有在url中提供

*/