Java Controller实现参数验证与统一异常处理流程详细讲解
参数验证
当我们在编写Java Web应用的Controller时,经常需要验证请求参数的合法性,例如是否为空、是否符合指定格式、是否在合理范围内等。Spring框架提供了一种方便的方式来进行参数验证,即使用JSR-303标准提供的注解来标识验证规则。我们可以使用javax.validation.constraints
包下的注解来进行验证,例如:
@RequestMapping("/user")
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
// ...
}
在这个示例中,@Valid
注解表示需要对User
对象进行参数验证。Spring会自动根据@Valid
注解查找User
类中使用了JSR-303注解的字段,并根据注解规则进行验证。例如,如果我们在User
类中添加了@NotNull
注解,表示该字段不能为null,那么当请求中的JSON数据缺少该字段或者该字段值为null时,Spring就会自动抛出MethodArgumentNotValidException
异常,我们可以在Controller中进行处理,例如:
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
List<String> errors = new ArrayList<>();
for (FieldError error : bindingResult.getFieldErrors()) {
errors.add(String.format("%s:%s", error.getField(), error.getDefaultMessage()));
}
ErrorResponse response = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), "请求参数不合法", errors);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
}
在这个示例中,我们使用了@ExceptionHandler
注解来处理MethodArgumentNotValidException
异常,该异常是Spring在参数验证过程中发现参数不合法时自动抛出的异常。在异常处理方法中,我们使用BindingResult
对象获取验证结果,并将结果转换为我们自定义的ErrorResponse
对象。
统一异常处理
在编写Java Web应用的Controller时,我们经常需要对出现异常的情况进行处理,例如防护未检查异常、统一返回异常信息等。Spring提供了多种方式来进行异常处理,其中一种常用方式是使用@ExceptionHandler
注解来标识异常处理方法,并使用ResponseEntity
对象返回异常信息,例如:
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFoundException(UserNotFoundException e) {
ErrorResponse response = new ErrorResponse(HttpStatus.NOT_FOUND.value(), "找不到用户", null);
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
}
在这个示例中,我们使用@ExceptionHandler
注解来标识对UserNotFoundException
异常的处理方法。在处理方法中,我们创建一个ErrorResponse
对象,并使用ResponseEntity
对象将其返回。在实际使用中,我们可以根据异常的不同类型,采取不同的处理方式,例如使用不同的HTTP状态码、返回不同的异常信息等。
示例说明
下面是一个完整的Controller示例,用于演示参数验证和统一异常处理的实现方式:
@RestController
public class UserController {
@PostMapping("/user")
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
// ...
}
@GetMapping("/user/{id}")
public ResponseEntity<User> getUser(@PathVariable long id) {
User user = userService.findUserById(id);
if (user == null) {
throw new UserNotFoundException();
}
return ResponseEntity.ok(user);
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
List<String> errors = new ArrayList<>();
for (FieldError error : bindingResult.getFieldErrors()) {
errors.add(String.format("%s:%s", error.getField(), error.getDefaultMessage()));
}
ErrorResponse response = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), "请求参数不合法", errors);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(response);
}
@ExceptionHandler(UserNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFoundException(UserNotFoundException e) {
ErrorResponse response = new ErrorResponse(HttpStatus.NOT_FOUND.value(), "找不到用户", null);
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
}
}
在这个示例中,我们使用了@Valid
注解来标识参数验证的字段,在getUser
方法中抛出UserNotFoundException
异常,使用@ExceptionHandler
注解和ErrorResponse
对象对异常进行统一处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java Controller实现参数验证与统一异常处理流程详细讲解 - Python技术站