首页 > 解决方案 > 带有注释的 Spring http 请求验证

问题描述

我正在尝试在 Spring Boot 应用程序中实现传入 http 请求的验证。我按照以下说明操作: https ://www.yawintutor.com/how-to-validate-request-body-in-spring-boot/ 但我没有得到文章中所述的回复。

我在控制台中遇到异常:DefaultHandlerExceptionResolver: ... DefaultMessageSourceResolvable: default message [must be a well-formed email address]]

根据设置的约束(显然是电子邮件格式)停止进程,但我没有收到 http 响应消息,只是Bad Request.

这是我的控制器:

    @RestController
    @Validated
    @RequestMapping(path = "/user", produces = MediaType.APPLICATION_JSON_VALUE)
    public class UserController {

            @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
            public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
        
                User createdUser = userService.createUser(user);
                return ResponseEntity.ok(user);
            }
    }

这是实体:

    @Entity
    @Builder
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class User {
        
        @Email
        private String email;
    }

我错过了什么?

标签: javaspring-bootvalidation

解决方案


使用 @ControllerAdvice 并创建您自己的响应对象来表示无效参数。下面的示例将返回所有无效参数及其消息。

  @ControllerAdvice
  public class ExceptionHandlerClass extends ResponseEntityExceptionHandler {

@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex,
                                                              HttpHeaders headers, HttpStatus status, WebRequest request) {
    List<String> validationList = ex.getBindingResult().getFieldErrors().stream().map(fieldError->fieldError.getDefaultMessage()).collect(Collectors.toList());

    return new ResponseEntity<>(new ExceptionObject(false,validationList), status);
} }

推荐阅读