在Spring boot 2.2.X应用程序中,我有一个rest端点,可以接受任何简单的Json对象。用于容纳此内容的Java类型为Map<String,Object>
。
示例输入:
{
"productId":123,
"type": Perishable
"location":"\\server\path\to\images\123.png"
}
图像文件位置字符串我遇到意外行为。在控制器中,当我检查Map<String,Object>
的内容时,看到以下值。有些斜杠被删除,有些则没有。 (我使用自定义映射器在json-> JsonParser中的所有位置都允许斜杠。功能为“ allow_backslash_escaping_any_character”。)
@PostMapping(value = "products}")
public UUID persistProduct(@RequestBody @NotNull Map<String,Object> parameters){
return this.productService.persistProduct(parameters);
}
请注意,前两个反斜杠被渲染为一个,但实际上仍然是两个反斜杠。我的应用程序现在将此Map反序列化为一个json字符串,以将其保存在数据库中。这是通过使用标准的Jackson类完成的:
public static String toJsonString(Object o){
try{
return new ObjectMapper().registerModule(new JavaTimeModule()).writer().writeValueAsString(o);
}
catch (JsonProcessingException e){
throw new UncheckedWrapperException("Converting an object to a JSON literal string", e);
}
}
持久化到数据库后,整个Json就会变成:
如果我现在通过始终用每个反斜杠字符转义另一个反斜杠来更改输入,则:
{
"productId":123,
"type": Perishable
"location":"\\\\server\\path\\to\\images\\123.png"
}
控制器中的结果看起来很有希望,但是数据库记录现在包含所有斜杠(所以转义突然没有效果,这意味着要存储许多斜杠吗?)
我不太了解这种行为。有没有一种方法可以告诉Spring或Jackson将确切输入到输入json中的内容存储在数据库中?我显然也想通过简单地禁用它来避免危及端点的安全性。