Я храню объекты в своей базе данных как строки JSON. Я хочу создать службу REST, которая предоставляет эти строки. Однако, когда я пишу свои методы, строки, которые я возвращаю, имеют свои кавычки. Например, я включил метод, который возвращает строку,
@RequestMapping(value = "test", method = RequestMethod.GET)
public @ResponseBody
String getTest() {
return "{\"a\":1, \"b\":\"foo\"}";
}
но когда я вызываю этот метод в браузере, я получаю обратно "{\" a\ ": 1, \" b\ ": \" foo\ "}", когда то, что я действительно хочу, это { "a": 1, "b": "foo" }. Я думаю, что "String" как тип возвращаемого типа, вероятно, проблема, но что еще я могу сделать? Класс-оболочка выполняет одно и то же:
{
"value" : "{\"a\":1, \"b\":\"foo\"}"
}
Я мог бы сериализовать его, а затем вернуть объект, но это кажется немного смешным. Вот, возможно, соответствующая часть моего файла конфигурации:
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(mappingJacksonHttpMessageConverter());
}
@Bean
MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter() {
MappingJacksonHttpMessageConverter mappingJacksonHttpMessageConverter = new MappingJacksonHttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
mappingJacksonHttpMessageConverter.setObjectMapper(objectMapper);
mappingJacksonHttpMessageConverter.setPrettyPrint(true);
return mappingJacksonHttpMessageConverter;
}
Спасибо
EDIT: как было предложено ниже, кажется, что строка кодируется двойным образом. Комментирование 2-х классов в моей конфигурации устраняет эту проблему. Тем не менее, у меня все еще есть другие места, где я хочу возвращать объекты, и хотел бы, чтобы они выполняли этот общий сериализационный bean, который я знаю, где настраивать. Поэтому я вижу свои варианты: a) Сделайте все сериализацию самостоятельно. Все методы возвращают строки, а те, которые уже являются JSON, возвращаются, а те, которые являются объектами, возвращают JSONUtil.toJson(объект). Мне не нравится такой подход, но я знаю, что это сработает. b) Используйте класс оболочки, который выглядит примерно так:
public static class Wrapper {
@JsonRawValue
private final String value;
}
Это приводит к неудобному "значению" на фронте, хотя это не имеет никакого реального значения.
В принципе, я хочу @JsonRawValue, но чтобы он работал над методами RequestMapping вместо свойств. Мысли? Мнения? Другие предложения?