Почему моя служба Spring возвращает любой тип контента, запрошенный клиентом? - PullRequest
5 голосов
/ 03 февраля 2012

У меня есть служба отдыха Spring, использующая Spring 3.1.0.RELEASE. Вот соответствующий код для рассматриваемого сервисного звонка:

@RequestMapping(value="/{var1}", method=RequestMethod.GET, produces="application/json")
@ResponseBody
public String getSomeStuff(@PathVariable final String var1) {
    return myJsonString;
}

Если я вызову это с помощью следующей команды curl, она с радостью вернет мне мою строку json с типом содержимого application / xml, тогда как я ожидаю 406 на основе документов Spring 3.1:

curl -v -H "Accept: application/xml" http://localhost:8080/MyServiceSite/myvalue

В моем приложении нет дополнительной настройки для этой службы (без сериализации), я возвращаю необработанный JSON без пост-обработки для настроенной службы. Я уверен, что что-то пропустил, кто-нибудь может указать на то, что я мог пропустить?

Редактировать: Вот документация , на которую я смотрел, пытаясь заставить это работать. В частности, раздел 16.3.2.5. Мой код очень похож, за исключением того, что его код выглядит так, будто он предполагает настройку конфигурации, позволяющую Spring обрабатывать сериализацию. Возможно, продукция не работает при обходе сериализации Spring?

Редактировать: я изменил свое ожидание для кода ответа. 415 будет означать, что я отправляю неправильное содержимое в теле запроса, тогда как 406 подходит для наличия заголовка accept, который не соответствует типу содержимого сервера.

В любом случае, я изменил этот метод, возвращаю Map и добавляю конфигурацию для сериализации в json, и теперь, если я отправляю неверный тип контента с клиента, я получаю правильный ответ 406. Кажется, что, возможно, настройка «производит» игнорируется, когда выходные данные метода не сериализуются.

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Условие получения является новым для Spring MVC 3.1 и поддерживается только с RequestMappingHandlerMapping и соответствующими классами поддержки @MVC, также new в Spring 3.1 .Я предполагаю, что вы используете классы поддержки 3.0 @MVC, которые не поддерживают условие продукции.В противном случае ваш код верен, как и ваши ожидания того, что должно произойти.

Использование заголовков = "Accept = application / json" не нужно в 3.1.Это именно то, для чего было введено условие производства.

1 голос
/ 03 февраля 2012

А как насчет атрибута headers для @RequestMapping. Вы можете установить там заголовок Accept. Что-то вроде:

@RequestMapping(value="/{var1}", method=RequestMethod.GET, produces="application/json", headers = "Accept=application/json")
@ResponseBody
public String getSomeStuff(@PathVariable final String var1) {
    return myJsonString;
}

Я не знаю, как Spring будет обрабатывать запрос к этому пути без соответствующего заголовка. Если он не дает того, что вы хотите, вам может потребоваться определить аналогичное отображение без заголовков, чтобы он отправил обратно ResponseEntity и установил код ответа или что-то в этом роде, но я надеюсь, что он обработает его соответствующим образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...