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";
}