[英]How to intercept the error message when spring boot web binding?
我嘗試使用Spring Boot Web Starter制作用戶注冊代碼。 首先,這些是包含約束的注冊表單類。
@Data
public class RegisterForm {
@NotBlank(message = "Not valid username.") // (1)
@Size(min=2, max=30, message="minimum 2 and maximum 30") // (3)
private String username;
@NotBlank(message = "Not valid password") // (1)
@Size(min=5, message = "minimum 5") // (3)
private String password;
@Size(max=50, message="maximum 50") // (3)
private String fullname;
@NotEmpty(message = "Not valid email") // (2)
private String email;
}
接下來的代碼是綁定用戶類和注冊表單類的控制器類。
@RequestMapping(value="/users/register", method=RequestMethod.POST)
public String register(@Valid RegisterForm registerForm, Model model, BindingResult bindingResult) {
if(!bindingResult.hasErrors()) {
User user = new User();
user.setUsername(registerForm.getUsername());
user.setPassword(registerForm.getPassword());
user.setEmail(registerForm.getEmail());
user.setFullname(registerForm.getFullname());
user.setRole(UserRole.USER);
this.userService.register(user);
return "redirect:/home";
}
return "/users/register";
}
下面的代碼是錯誤控制器類。
@RequestMapping("/error")
public String errorHandle(HttpServletRequest request) {
Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
if(status != null) {
Integer statusCode = Integer.valueOf(status.toString());
if(statusCode.equals(HttpStatus.BAD_REQUEST.value())) {
return "/errors/400";
} else if(statusCode.equals(HttpStatus.NOT_FOUND.value())) {
return "/errors/404";
} else if(statusCode.equals(HttpStatus.FORBIDDEN.value())) {
return "/errors/403";
} else if(statusCode.equals(HttpStatus.INTERNAL_SERVER_ERROR.value())) {
return "/errors/500";
}
}
return "errors/default";
}
並且我有意地犯了錯誤,然后將錯誤消息帶到如下所示的控制台上,並用/ error / 400 html引發了400異常。
Field error in object 'registerForm' on field 'username': rejected value []; default message [minimum 2 and maximum 30]
Field error in object 'registerForm' on field 'username': rejected value []; default message [Not valid username]
Field error in object 'registerForm' on field 'email': rejected value []; default message [Not valid email]
Field error in object 'registerForm' on field 'password': rejected value []; default message [Not valid password]
Field error in object 'registerForm' on field 'password': rejected value [];default message [minimum 5]]
我的問題是我不知道如何將registerForm消息的字段錯誤發送到/ error / 400 html,以便用戶可以確認registerForm的哪個字段違反了約束。 我想知道registerForm的字段錯誤如何傳輸到/ error / 400 html。 任何想法,請。
第一步:像這樣驗證控制器中的數據
@RequestMapping(value="/users/register", method=RequestMethod.POST)
public String register(@Valid RegisterForm registerForm)......
第二步:提出控制器建議以捕獲異常
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = MethodArgumentNotValidException.class)
@ResponseBody
public Object handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
//here you can use api of MethodArgumentNotValidException to do anything you want
//e.getBindingResult(),e.getFieldErrors(),etc;
// you can change the return type of Object
}
您需要擴展ResponseEntityExceptionHandler
,以提供跨所有RequestMapping
方法的集中式異常處理。 該基類提供了一個ExceptionHandler
方法,用於處理內部Spring MVC異常。 此方法返回一個ResponseEntity
用於使用HttpMessageConverter
消息轉換器寫入響應。
@ControllerAdvice
@Order(Ordered.HIGHEST_PRECEDENCE)
public class RestExceptionHandler extends ResponseEntityExceptionHandler {
// All Exceptions Handler.
@ExceptionHandler(Exception.class)
public final ResponseEntity<ExceptionBean> handleAllExceptions(Exception ex, WebRequest request) {...}
// Unique Constraint Violation Exception Handler.
@ExceptionHandler(DataIntegrityViolationException.class)
public final ResponseEntity<ExceptionBean> handleDataIntegrityViolationExceptions(DataIntegrityViolationException ex, WebRequest request) {...}
// Custom Exceptions Handler.
@ExceptionHandler(DomainException.class)
public final ResponseEntity<ExceptionBean> handleDomainExceptions(DomainException ex, WebRequest request) {
ExceptionBean exceptionBean = new ExceptionBean(new Date(), ex.getMessage(),
request.getDescription(false));
LOGGER.error(ex.getMessage(), ex);
return new ResponseEntity<>(exceptionBean, HttpStatus.BAD_REQUEST);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.