spring Sping Boot 中的DTO验证不起作用

qgzx9mmu  于 5个月前  发布在  Spring
关注(0)|答案(4)|浏览(78)

我有一个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));
            }
    }

字符串
和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;
}


当我传递CreditDetailsWithoutId示例时,我没有得到任何错误。为什么我的验证不起作用?如果有关系,我使用

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


的数据

bweufnob

bweufnob1#

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

  • @DecimalMax:字段或属性的值必须是小于或等于value元素中的数字的十进制值。* reference
@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;
    }
}

mbjcgjjk

mbjcgjjk2#

我刚刚调用了maven clean install并开始验证

yh2wf1be

yh2wf1be3#

我的工作是:
pom.xml:

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

字符串
控制器:

@Slf4j
@RestController
@RequestMapping("/api/v1/auth")
public class AuthHubController {
    @PostMapping("/authenticate")
        public ResponseEntity<?> authenticate(HttpServletRequest request, @Validated @RequestBody AuthRequestDto authRequestDto) {
    
    }


Dto:

public class AuthRequestDto {
    @Pattern(regexp = "\\d{16}", message = "Card number must contain exactly 16 digits")
    String cardNumber; //card number
    }


完全@验证

ffx8fchx

ffx8fchx4#

你必须在你的控制器类中添加EexceptionError:

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

字符串

相关问题