Spring Mvc Restcontroller возвращает строку JSON
У меня есть Spring MVC контроллер со следующим методом:
@RequestMapping(value = "/stringtest", method = RequestMethod.GET)
public String simpletest() throws Exception {
return "test";
}
Это находится внутри контроллера, который начинается так:
@RestController
@RequestMapping(value = "/root")
public class RootController
Когда я вызываю другие методы, которые возвращают объекты, эти объекты сериализуются Джексоном в JSON. Но этот метод, который возвращает строку, не преобразуется в JSON. Если это не ясно, вот пример использования curl:
$curl http://localhost:8080/clapi/root/stringtest
test
Таким образом, проблема в том, что "test" без кавычек не является строкой JSON, но мой REST-клиент ожидает строку. Я ожидал, что команда curl покажет эту строку с кавычками, так что вместо этого это допустимый JSON:
"test"
Я использую Spring WebMVC 4.1.3 и Jackson 2.4.3. Я попытался добавить атрибут "производит" в RequestMapping, чтобы сказать, что он должен возвращать JSON. В этом случае отправляемым обратно атрибутом Content-Type является "application/json", но все же тестовая строка не заключена в кавычки.
Я мог бы обойти это, вызвав библиотеку JSON для преобразования Java String в JSON, но, похоже, Spring MVC и Jackson обычно делают это автоматически. Все же как-то они не делают этого в моем случае. Любые идеи, что я мог неправильно настроить, чтобы получить только тест обратно, а не "тест"?
3 ответа
Оказывается, когда вы используете @EnableWebMvc
примечание, что по умолчанию он включает несколько конвертеров http-сообщений. Второй в списке StringHttpMessageConverter
который документация говорит, будет применяться для text/*
типы контента. Тем не менее, после выполнения отладчика, он применяется к объектам String для */*
типы контента - который, очевидно, включает в себя application/json
,
MappingJackson2HttpMessageConverter
который несет ответственность за application/json
типы контента находятся ниже в этом списке. Так что для объектов Java, отличных от String, вызывается этот. Вот почему он работал для типов Object и Array, но не для String, несмотря на хорошие рекомендации по использованию атрибута yield для установки application/json
Тип содержимого. Несмотря на то, что этот тип содержимого необходим для запуска этого конвертера, конвертер String сначала выполнял задание!
Как я расширяю WebMvcConfigurationSupport
класс для какой-то другой конфигурации, я переопределил следующий метод, чтобы сначала поместить конвертер Джексона, поэтому, когда тип содержимого application/json
тогда этот будет использоваться вместо строкового конвертера:
@Override
protected void configureMessageConverters(
List<HttpMessageConverter<?>> converters) {
// put the jackson converter to the front of the list so that application/json content-type strings will be treated as JSON
converters.add(new MappingJackson2HttpMessageConverter());
// and probably needs a string converter too for text/plain content-type strings to be properly handled
converters.add(new StringHttpMessageConverter());
}
Теперь, когда я вызываю метод теста из curl, я получаю желаемый "test"
вывод вместо просто test
Так что угловой клиент, ожидающий JSON, теперь доволен.
Попробуй это:
@RequestMapping(value = "/stringtest", method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
Попробуйте что-то вроде этого
@RequestMapping(value = "/stringtest", method = RequestMethod.GET, produces="application/json")
public @ResponseBody String simpletest() throws Exception {
return "test";
}