簡體   English   中英

Spring 中的 DTO 驗證啟動不工作

[英]DTO validation in Spring Boot not working

我有一個帶有 POST 方法的 controller:

        @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));
            }
    }

和 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;
}

當我以 111% 的比例傳遞 CreditDetailsWithoutId 實例時,我沒有收到任何錯誤。 為什么我的驗證不起作用? 如果重要我用

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

沒問題

嘗試將十進制值傳遞給@DecimalMin、@DecimalMax,:

@DecimalMax:字段或屬性的值必須是小於或等於value元素中數字的十進制值。 參考

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

稍后編輯:刪除@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;
    }
}

您必須在您的 controller class 中添加 EexceptionHandler:

import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;


@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
    Map<String, String> errors = new HashMap<>();
    ex.getBindingResult().getAllErrors().forEach((error) -> {
        String fieldName = ((FieldError) error).getField();
        String errorMessage = error.getDefaultMessage();
        errors.put(fieldName, errorMessage);
    });
    return errors;
}

我剛剛撥打maven clean install並開始驗證

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM