You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中Float类型字段@NotBlank校验异常问题咨询

问题原因分析
  • 核心错误:@NotBlank注解仅适用于String类型,你在OrderDto的Float price字段上误用了该注解,导致校验框架无法找到对应数值类型的校验器,直接抛出UnexpectedTypeException。
  • 次要问题:OrderDto中doorNumber的getter/setter方法不符合JavaBean规范,当前是doorNumber()和doorNumber(String),正确写法应为getDoorNumber()和setDoorNumber(String),否则BeanUtils.copyProperties可能无法正确复制该字段值。
  • 额外问题:OrderDto中block字段在OrderModel里允许为空(nullable = true),但Dto中加了@NotBlank,会导致空值被校验拒绝,不符合业务逻辑。
解决方案

1. 修正price字段的校验注解

将OrderDto中price字段的@NotBlank替换为适合数值类型的校验注解,根据业务需求选择:

  • @NotNull:确保price不为null(必填)
  • @Positive:确保price是正数(符合订单价格的常规逻辑)
  • @PositiveOrZero:允许价格为0(按需选择)

2. 修正JavaBean规范问题

修复doorNumber的getter/setter方法,同时移除block字段的错误@NotBlank注解。

修改后的完整OrderDto代码:

package com.api.order_control.dtos;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;

public class OrderDto {
    @NotBlank
    private String customerName;
    @NotBlank
    private String phoneNumber;
    @NotBlank
    private String address;
    @NotBlank
    private String doorNumber;
    // 移除block字段的@NotBlank,匹配Model中的nullable配置
    private String block;
    @NotBlank
    private String order;
    @NotNull(message = "价格不能为空")
    @Positive(message = "价格必须为正数")
    private Float price;

    // 修正doorNumber的getter/setter
    public String getDoorNumber() {
        return doorNumber;
    }

    public void setDoorNumber(String doorNumber) {
        this.doorNumber = doorNumber;
    }

    // 其他getter/setter保持不变
    public String getCustomerName() {
        return customerName;
    }

    public void setCustomerName(String customerName) {
        this.customerName = customerName;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getBlock() {
        return block;
    }

    public void setBlock(String block) {
        this.block = block;
    }

    public String getOrder() {
        return order;
    }

    public void setOrder(String order) {
        this.order = order;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }
}

3. 可选优化建议

对于金额类字段,推荐使用BigDecimal替代Float,避免浮点数精度丢失问题,校验注解@NotNull、@Positive等同样适用。

内容的提问来源于stack exchange,提问作者Routfin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:05:23