代码之家  ›  专栏  ›  技术社区  ›  user1884155

带斜杠的Spring Boot Json反序列化

  •  0
  • user1884155  · 技术社区  · 5 年前

    在springboot2.2.X应用程序中,我有一个rest端点,它接受任何简单的Json对象。用于适应这种情况的java类型是 Map<String,Object> .

    输入示例:

    {
       "productId":123,
       "type": Perishable
       "location":"\\server\path\to\images\123.png"
    }
    

    图像文件位置字符串出现意外行为。在我的控制器中,当我检查 地图<字符串,对象>

    @PostMapping(value = "products}")
    public UUID persistProduct(@RequestBody @NotNull Map<String,Object> parameters){
        return this.productService.persistProduct(parameters);
    }
    

    Controller after deserialization

    请注意,前两个反斜杠渲染为一个,但实际上仍然是两个反斜杠。我的应用程序现在将这个映射反序列化回一个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就变成:

    enter image description here

    如果我现在通过一致地用另一个反斜杠转义每个反斜杠字符来更改输入:

    {
       "productId":123,
       "type": Perishable
       "location":"\\\\server\\path\\to\\images\\123.png"
    }
    

    控制器中的结果看起来很有希望,但是数据库记录现在包含所有的斜杠(因此转义突然没有效果,这意味着存储了多少斜杠?)

    controller

    database

    我真的不明白这种行为。有没有办法告诉Spring或Jackson在数据库中准确地存储输入json中输入的内容?显然,我也希望通过简单地禁用它来避免危及端点的安全性。

    0 回复  |  直到 5 年前