如何解决Spring Boot验证Long值 背景为什么它可以与第一个JSON一起使用?
这是我们要映射传入请求的类
@Getter
@Setter
public class FooRequest {
@Size(max = 255,message = "{error.foo.name.size}")
private String name;
@Digits(integer = 15,fraction = 0,message = "{error.foo.fooId.size}")
private Long fooId;
@Digits(integer = 15,message = "{error.foo.barId.size}")
private Long barId;
}
我已经像上面那样使用javax.validation.constraints.*
。如果我们发送类似的请求
{
"name": "Test","fooId": "0001234567","barId": "0003456789"
}
然后它可以正常工作,我们可以将结果保存在数据库中,但是如果我们将其发送为:
{
"name": "Test","fooId": 0001234567,"barId": 0003456789
}
然后我们得到400 Bad Request
。我没有弄错我在做什么错,我只想确保用户发送的数字长度在1到15之间,并且想要将其映射到Long
变量中。是因为fraction
还是因为所有这些值都以0开头?
解决方法
由于前导零,第二个JSON是 not 一个valid json。
背景
Spring使用Jackson库进行JSON交互。
如果您尝试解析第二个JSON,默认情况下,杰克逊的ObjectMapper
会抛出:
public class Main {
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.readValue("{\"name\": \"Test\",\"fooId\": 0001234567,\"barId\": 0003456789}",FooRequest.class);
}
}
例外是:
Exception in thread "main" com.fasterxml.jackson.core.JsonParseException: Invalid numeric value: Leading zeroes not allowed
at [Source: (String)"{"name": "Test","fooId": 0001234567,"barId": 0003456789}"; line: 1,column: 28]
一个人可以通过JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS
允许前导零:
public class Main {
public static void main(String[] args) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS,true);
FooRequest fooRequest = objectMapper.readValue("{\"name\": \"Test\",FooRequest.class);
System.out.println(fooRequest.getBarId());
}
}
或者在春季通过Spring Boot的application.properties
:
spring.jackson.parser.allow-numeric-leading-zeros=true
然后,第二个JSON将成功解析。
为什么它可以与第一个JSON一起使用?
因为默认情况下,杰克逊的MapperFeature.ALLOW_COERCION_OF_SCALARS
已打开。
通过其javadoc:
启用此功能后,只要文本值匹配(例如,允许将字符串“ true”等同于JSON布尔令牌
true
;或将字符串“ 1.0”用作{ {1}}。
因为所有这些值都以0开头?
事实证明,是的,但是出于稍有不同的原因
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。