Spring Boot Json десериализация с косой чертой - PullRequest
0 голосов
/ 06 марта 2020

В приложении Spring boot 2.2.X у меня есть конечная точка отдыха, которая принимает любой простой объект Json. Тип java, используемый для учета этого: Map<String,Object>.

Пример ввода:

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

Я столкнулся с неожиданным поведением с расположением файла изображения String. В моем контроллере, когда я проверяю содержимое Map<String,Object>, я вижу следующее значение. Некоторые слэши удалены, а некоторые нет. (Я использовал собственный сопоставитель, чтобы разрешить слэши во всех местах в json -> JsonParser.Feature "allow_backslash_escaping_any_character").

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

Controller after deserialization

Обратите внимание, что первые два обратных слеша отображаются как один, но на самом деле это все еще два обратных слеша. Мое приложение теперь десериализовало эту Карту обратно в строку json, чтобы сохранить ее в базе данных. Это делается с помощью стандартных классов Джексона:

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

Если я теперь изменю ввод, последовательно экранируя каждый символ backsla sh с другим backsla sh:

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

Результат в контроллере выглядит многообещающим, но запись базы данных теперь содержит ВСЕ слэши (поэтому внезапное побег не имеет никакого эффекта, что означает, что многие слэши сохраняются?)

controller

database

Я не очень понимаю это поведение. Есть ли способ сообщить Спринг или Джексону ТОЧНО сохранить в базе данных то, что вводится во вход json? Я, очевидно, также хотел бы избежать угрозы безопасности конечной точки, просто отключив это.

...