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";
}
Другие вопросы по тегам