В приложении 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);
}
Обратите внимание, что первые два обратных слеша отображаются как один, но на самом деле это все еще два обратных слеша. Мое приложение теперь десериализовало эту Карту обратно в строку 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 становится:
Если я теперь изменю ввод, последовательно экранируя каждый символ backsla sh с другим backsla sh:
{
"productId":123,
"type": Perishable
"location":"\\\\server\\path\\to\\images\\123.png"
}
Результат в контроллере выглядит многообещающим, но запись базы данных теперь содержит ВСЕ слэши (поэтому внезапное побег не имеет никакого эффекта, что означает, что многие слэши сохраняются?)
Я не очень понимаю это поведение. Есть ли способ сообщить Спринг или Джексону ТОЧНО сохранить в базе данных то, что вводится во вход json? Я, очевидно, также хотел бы избежать угрозы безопасности конечной точки, просто отключив это.