Весна 3.1 или более поздняя @RequestMapping потребляет/производит

У меня есть вопрос в отношении @RequestMapping и создания части @RequestMapping. У меня есть конечная точка, что я хочу принять JSON и XML и вернуть JSON, когда JSON передается и возвращает XML при передаче XML. Есть ли что-то особенное, что я должен сделать, чтобы сделать эту работу?

Пример кода приведен ниже.

@RequestMapping(value = "/something", method = PUT, 
                consumes = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE}, 
                produces = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE})
public SomeObject updateSomeObject(SomeObject acct) {
    return doStuff(acct);
}

Будет ли это работать так, как я ожидаю, или мне нужны две конечные точки updateSomeObjectXML и updateSomeObjectJson для обработки обоих случаев?

Спасибо, Майк

Ответ 1

Статья из блога Spring - Content Negotiation с использованием Spring MVC - содержит подробные сведения о том, как согласование контента работает с Spring MVC, вкратце, если вы хотите, чтобы одна и та же конечная точка обрабатывала XML и JSON, ваше сопоставление корректно, чтобы обобщить из статьи:

  1. Используйте расширение пути - вы можете отправить json в /something.json и xml в /something.xml и ожидать то же самое на обратном пути

  2. Используйте заголовок Accept, используйте значение application/json или application/xml и используйте Content-Type чтобы указать тип медиафайла.

Ответ 2

Короткий ответ:
Аннотировать метод с @ResponseBody и параметром метода с @RequestBody, и он будет работать (нет необходимости в 2 методах).

Объяснение:
Во-первых, производят и потребляют атрибуты, используемые для сужения типов отображения. По умолчанию будет найден первый найденный HttpMessageConverter, соответствующий запрошенному типу носителя.

Во-вторых, клиент запрашивает тип носителя, задавая тип носителя:
- принять заголовок запроса
- Требуется URL-адрес sufix (http://....//some .xml => "application/xml")
- параметр формата URL (.../some? Format = xls)

В- третьих, производит в сочетании с @ResponseBody будет производить объект требуемого типа носителя (хороший для запросов GET, когда вам нужно отправить что - то обратно клиенту) и потребляет в сочетании с @RequestBody будет потреблять объект запрашиваемых средств массовой информации type (хорошо для POST-запросов, когда вам нужно что-то получить от клиента).

Четыре, когда @ResponseBody не используется, HttpMessageConverters не используются. Скорее ViewResolvers запускают и производят представление (HTML, PDF...), а тип возврата должен следовать правилам, которые сопровождают ViewResolvers (для получения более подробной информации см. Определение разрешения по умолчанию и InternalResourceViewResolver).

Надеюсь, поможет.

Другие источники:
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#consumes-- http://spring.io/blog/2013/05/11/содержание согласование-использование пружинного-MVC

Ответ 3

Что ж,

consumes/производит принимает String[] в качестве параметра (см. RequestMapping from Spring documentation), поэтому я считаю, что это сработает. Вы также можете попробовать headers = "content-type=application/json,application/xml".