【问题标题】:Nothing happens when trying to validate fields with Bean Validation尝试使用 Bean Validation 验证字段时没有任何反应
【发布时间】:2020-12-17 13:34:40
【问题描述】:

我正在尝试对我的模型类应用验证,但它不起作用,它只是忽略并注册数据库中的值,即使它是 null 或空。
我正在使用龙目岛

我的用户模型:

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;


@NotNull
@NotBlank

private String nome;  

@NotNull
@NotBlank
private BigDecimal incomeMonthly;

@Convert(converter = RiskEnumConverter.class)
private RiskEnum risk; 

@OneToOne(cascade = CascadeType.ALL)
private Address address;

我的地址模型:

@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
   
    @NotNull
    @NotBlank
    private Integer number; 
   
    @NotNull
    @NotBlank
    private String neighborhood;
    
    @NotNull
    @NotBlank
    private String postalCode; 
    
    @NotNull
    @NotBlank
    private String state;
   
    @NotNull
    @NotBlank
    private String city;

我的控制器:

@PostMapping
    public ResponseEntity<User> save(@Valid @RequestBody User user, HttpServletResponse response) {
        
        User saveUser = this.userService.save(cliente);
        publisher.publishEvent(new ResourceCreatedEvent(this, response, saveUser.getId()));
        return ResponseEntity.status(HttpStatus.CREATED).body(saveUser);
    }

POM 依赖:

<dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
        </dependency>

【问题讨论】:

  • 也许你需要用@Validated注释你的rest控制器
  • @DanielJacob 一直在数据库中注册并返回 201
  • 只添加一个 API 不会做任何事情,你还需要像 hibernate-validator 这样的 API 的实现,没有它,什么都不会发生。
  • @M.Deinum 这是通过注解完成的吗?
  • 作为@M。 Deinum 强调它,你错过了项目中的依赖项。仅使用 validation-api 时,您提供的接口没有实现。

标签: java spring


【解决方案1】:

Hibernate Validator 是验证 API 的参考实现。

因此,您需要将其添加到您的 pom.xml

<dependency>
  <groupId>org.hibernate.validator</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>6.0.13.Final</version> 
</dependency>

您可以根据需要使用版本。

如果您想对此进行一些探索,请查看此reference

【讨论】:

    【解决方案2】:

    从上面的代码看来,您缺少一个可以捕获验证失败的异常处理程序。处理程序允许您指定应如何在应用程序中处理验证失败。 baeldung 网站上的This article 展示了如何设置异常处理程序。

    在我的项目中,我通常会设置一个错误处理类,其中包含针对每种错误的方法,例如

    @ControllerAdvice
    public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
    
        @ExceptionHandler(MethodArgumentNotValidException.class)
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        @ResponseBody
            public ValidationFailureResponse validationError(MethodArgumentNotValidException ex) {
                BindingResult result = ex.getBindingResult();
                final List<FieldError> fieldErrors = result.getFieldErrors();
    
                return new ValidationFailureResponse((FieldError[])(fieldErrors.toArray(new FieldError[fieldErrors.size()])));
             }
        }
    }
    

    如 cmets 中所述,您将需要一个验证实现来完成这项工作。 Baeldung 文章中提到了以下 mvn 依赖项:

    <dependency> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-validation</artifactId> 
    </dependency>
    

    【讨论】:

    • 验证也可以在没有异常处理程序的情况下工作。他只是缺少一个实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2012-04-30
    • 2014-12-09
    相关资源
    最近更新 更多