java - SpringBoot 使用@RequestBody 注释原子地将整数转换为布尔值?如何拒绝将整数转换为布尔值?
问题描述
我的请求是这样的application/json
类型:{"able": true}
,但是当我这样发送请求时{"able":12345}
,该字段able
仍然可以获得正确的值true
。为什么?
@PatchMapping("/{id}/path/{name}")
public ResponseEntity someMethod(
@Valid @RequestBody SomeRequest request) {
// do something
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class SomeRequest {
@AssertTrue
@NotNull
private Boolean able;
}
解决方案
因为当字段类型为 bool 时,jackson.databind 会将 int 解析为 bool。在中查找代码NumberDeserializers.BooleanDeserializer
JsonToken t = p.getCurrentToken();
if (t == JsonToken.VALUE_TRUE) {
return Boolean.TRUE;
}
if (t == JsonToken.VALUE_FALSE) {
return Boolean.FALSE;
}
return _parseBoolean(p, ctxt);
_parseBoolean(p, ctxt)
将 int 解析为 bool。
我们可以自己做,不使用默认值。
- 创建我们的 bool deser 类。
public class MyDeser extends JsonDeserializer {
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonToken t = p.getCurrentToken();
if (t == JsonToken.VALUE_TRUE) {
return Boolean.TRUE;
}
if (t == JsonToken.VALUE_FALSE) {
return Boolean.FALSE;
}
return null;
// not parse int to bool but null and it may work ok.
// if throw new IOException(), it will work fail. Maybe return null means use other deser to deal it. throw Exception means fail. I don't know it clearly.
}
}
- 创建一个配置并注入一个 SimpleModule bean。我在申请中写
@SpringBootApplication
@Configuration
public class DemoApplication {
@Bean
public SimpleModule addDeser() {
return new SimpleModule().addDeserializer(Boolean.class, new MyDeser());
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
推荐阅读
- angular - Angular/tailwindcss 在不需要时阻止 sass/css 编译
- machine-learning - Julia vs Rust ML 哪个是最好的路径?
- flutter - 参数类型'CurrentUser? 函数(用户)”不能分配给参数类型“当前用户函数(用户?)”
- linux - 为什么在使用 yarn global 命令安装 angular-cli 后 ng --version 命令不起作用?
- google-chrome - 为什么谷歌浏览器会发出比文件大小更大范围的http下载请求以及如何处理?
- python - 硒更多结果xpath
- python - Python 模拟的 ASCII85 编码的“Adobe 实现”是什么?
- javascript - 在没有线性搜索的情况下检查数组中是否存在元素
- php - 使用 Gravity Forms Product Add-ons + Woocommerce,可以创建添加到购物车的链接吗?
- fabricjs - Fabric.JS 尺寸指南