Spring Boot 中的 DTO 验证不起作用

Sme*_*sii 5 java spring hibernate spring-boot

我有一个带有 POST 方法的控制器:

        @RestController
        @RequestMapping(value = "/creditDetails", produces = MediaType.APPLICATION_JSON_VALUE)
        @RequiredArgsConstructor
        @Validated
        public class CreditDetailsController {
       
            @ResponseStatus(HttpStatus.CREATED)
            @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
            public CreditDetailsResponse createCreditDetails(@RequestBody @Valid CreditDetailsRequestWithoutId request) {
                return CreditDetailsResponse.convertToResponse(creditDetailsService.createCreditDetails(request));
            }
    }
Run Code Online (Sandbox Code Playgroud)

和DTO:

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class CreditDetailsRequestWithoutId {
    @DecimalMax("10_000_000")
    private BigDecimal creditLimit;
    @DecimalMin("0")
    @DecimalMax("20")
    private BigDecimal creditPercent;
    private UUID bankId;
}
Run Code Online (Sandbox Code Playgroud)

当我以 111% 传递 CreditDetailsWithoutId 实例时,我没有收到任何错误。为什么我的验证不起作用?如果重要的话我用

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <version>2.6.3</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

没问题

hap*_*ngs 2

尝试将十进制值传递给@DecimalMin、@DecimalMax:

@DecimalMax:字段或属性的值必须是小于或等于 value 元素中的数字的十进制值。 参考

@DecimalMin("0.0")
@DecimalMax("20.0")
private BigDecimal creditPercent;
Run Code Online (Sandbox Code Playgroud)

后来编辑:删除@Data并添加基本的getter和setter解决了我这边的问题,希望它能起作用。

// @Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class CreditDetailsRequestWithoutId {

    @DecimalMax("1E+7")
    private BigDecimal creditLimit;

    @DecimalMin("0.0")
    @DecimalMax("20.0")
    private BigDecimal creditPercent;

    public BigDecimal getCreditPercent(){
        return creditPercent;
    }

    public void setCreditPercent(BigDecimal creditPercent){
        this.creditPercent = creditPercent;
    }

    public BigDecimal getCreditLimit(){
        return creditLimit;
    }

    public void setCreditLimit(BigDecimal creditLimit){
        this.creditLimit = creditLimit;
    }
}

Run Code Online (Sandbox Code Playgroud)