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

Итак, проблема в том, что" тест " без кавычек не является строкой JSON, но мой клиент REST ожидает строку. Я ожидал, что команда curl покажет эту строку с кавычками вокруг нее, поэтому вместо этого это законный JSON:

"test"

Я использую Spring WebMVC 4.1.3 и Jackson 2.4.3. Я попытался добавить атрибут" produces " в RequestMapping, чтобы сказать, что он должен вернуть JSON. В этом случае атрибут Content-Type, отправленный обратно, - "application/json", но тестовая строка не цитируется.

Я мог бы обойти это, вызвав библиотеку JSON для преобразование строкой Java в JSON, но похоже, что Spring MVC и Jackson обычно делают это автоматически. Но в моем случае они почему-то этого не делают. Любые идеи, что я мог бы настроить неправильно, чтобы получить просто тест обратно вместо "теста"?

3 ответов


оказывается, что при использовании @EnableWebMvc аннотация, что по умолчанию он включает кучу преобразователей http-сообщений. Второй в списке -StringHttpMessageConverter который, как говорится в документации, будет применяться для text/* типы контента. Однако после перехода через отладчик он применяется к строковым объектам для */* типы контента - который, очевидно, включает в себя application/json.

на MappingJackson2HttpMessageConverter ответственного за application/json типы контента ниже на этом список. Поэтому для объектов Java, отличных от String, этот вызывается. Вот почему он работал для типов объектов и массивов, но не String - несмотря на хорошие предложения по использованию атрибута produces для set application/json тип содержимого. Хотя этот тип контента необходим для запуска этого преобразователя, строковый преобразователь сначала схватил задание!

как я расширял 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";
}