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
相关产品推荐
相关产品推荐

