Spring引导验证在整型字段中采用浮点值
我正在尝试实现带有请求验证的POST服务 我的Spring引导验证在整型字段中采用浮点值,spring,spring-boot,jackson,Spring,Spring Boot,Jackson,我正在尝试实现带有请求验证的POST服务 我的Controller方法如下所示 public void updateScore(@Valid ScoreRequest) ScoreRequest如下所示 import javax.validation.constraints.*; 导入龙目数据; @资料 公共类请求{ @最小值(0) @最高(100) @数字(分数=0,整数=3) 私人整数分; ... } 在我为分数传递整数值之前,一切都很好,但是如果我也传递分数部分,请求就会通过,Spri
Controller
方法如下所示
public void updateScore(@Valid ScoreRequest)
ScoreRequest
如下所示
import javax.validation.constraints.*;
导入龙目数据;
@资料
公共类请求{
@最小值(0)
@最高(100)
@数字(分数=0,整数=3)
私人整数分;
...
}
在我为分数传递整数值之前,一切都很好,但是如果我也传递分数部分,请求就会通过,Spring会以某种方式截断分数并在请求中使用整数部分
我希望它抛出一个验证错误,因为分数的数据类型不匹配
它与后续请求一起工作,并在请求对象中使用10作为分数值。我希望它会出错,我做错了什么
{"score": 10.234234}
Spring Boot版本:2.0.3。发布版不要使用此注释:
@数字(分数=0,整数=3
与整数),因为为整数设置分数是无用的
你为什么不:
@Min(0)
@Max(100)
@Digits(fraction = 0, integer = 3)
private BigDecimal score;
如果仔细查看@数字
注释的定义
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
因此,此注释也可以应用于方法。
如果您阅读文档,它会说此注释可以应用于以下类型
- 大十进制
- 大整数
- 字符序列
- 字节(或字节)
- 短(或短)
- 整数(或整数)
- 长(或长)
注释的整数
字段检查整数位数,而注释的分数
字段检查小数位数。
自,您将字段声明为整数值。它将值转换为整数并截断小数部分。
这不会使验证失败,因为两个字段都满足验证要求。
此注释理想情况下仅用于BigDecimal
类型。我试图调试Spring Boot的验证类以查找发生的情况,但在查看@M.Denium的注释后,我搜索了Jackson问题并找到了相关的SO条目
我使用的答案是@Jichao Zhang
,不过只是为了确认@Eduardo Sanchez Ros
的答案同样有效。这对我来说是有效的
ObjectMapper.configure(DESERIALIZATION_FEATURE.ACCEPT_FLOAT_AS_INT, false);
Jackson可能会毫无怨言地将其转换为整数。验证也没有意义,因为整数从来没有分数。问题是,由于我们没有收到错误,使用此请求的客户端会假定10.234234
已正确保存。这不是您可以用@Digi修复的t
。除非您接受的是浮点数
或双精度
而不是整数
。您应该做的是禁用接受浮点数为INT
功能,这将无法将浮点数映射为INT,并导致序列化错误。@M.Deinum感谢您的见解,我在这篇文章中找到了您想要的解决方案要抛出异常?然后执行一些if
。if(yourNumber==Math.round(yourNumber)throw yournexception();我认为这些请求失败的一个可能解决方案是将字段声明为Float
,并将分数
字段保持为0
。我不确定这是否可行。