Spring引导验证在整型字段中采用浮点值

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

我正在尝试实现带有请求验证的POST服务

我的
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
。我不确定这是否可行。