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中提供
*/


发布评论