Рубрики
Без рубрики

Согласование содержимого Spring MVC

Руководство по настройке согласования контента в приложении Spring MVC, а также по включению и отключению различных доступных стратегий.

Автор оригинала: baeldung.

1. Обзор

В этой статье описывается, как реализовать согласование контента в проекте Spring MVC.

Как правило, существует три варианта определения типа носителя запроса:

  • Использование суффиксов URL (расширений) в запросе (например, . xml/.json )
  • Использование параметра URL в запросе (например, ?формат=json )
  • Использование заголовка Accept в запросе

По умолчанию это порядок, в котором Spring contentnegotiationmanager попытается использовать эти три стратегии. И если ни один из них не включен, мы можем указать запасной вариант для типа контента по умолчанию.

2. Стратегии Согласования Контента

Давайте начнем с необходимых зависимостей – мы работаем с представлениями JSON и XML, поэтому в этой статье мы будем использовать Jackson для JSON:


    com.fasterxml.jackson.core
    jackson-core
    2.10.2


    com.fasterxml.jackson.core
    jackson-databind
    2.10.2

Для поддержки XML мы можем использовать либо JAXB, XStream, либо более новую поддержку Jackson-XML.

Поскольку мы объяснили использование заголовка Accept в более ранней статье о HttpMessageConverters , давайте подробно остановимся на первых двух стратегиях.

3. Стратегия суффикса URL-адреса

По умолчанию эта стратегия отключена, но платформа может проверить расширение пути прямо из URL-адреса, чтобы определить тип выходного содержимого.

Прежде чем перейти к конфигурациям, давайте быстро рассмотрим пример. У нас есть следующая простая реализация метода API в типичном контроллере Spring:

@RequestMapping(
  value = "/employee/{id}", 
  produces = { "application/json", "application/xml" }, 
  method = RequestMethod.GET)
public @ResponseBody Employee getEmployeeById(@PathVariable long id) {
    return employeeMap.get(id);
}

Давайте вызовем его, используя расширение JSON, чтобы указать тип носителя ресурса:

curl http://localhost:8080/spring-mvc-basics/employee/10.json

Вот что мы можем получить, если будем использовать расширение JSON:

{
    "id": 10,
    "name": "Test Employee",
    "contactNumber": "999-999-9999"
}

И вот как будет выглядеть запрос-ответ с помощью XML:

curl http://localhost:8080/spring-mvc-basics/employee/10.xml

Орган реагирования:


    999-999-9999
    10
    Test Employee

Теперь, если мы не используем какое-либо расширение или используем то, которое не настроено, будет возвращен тип контента по умолчанию:

curl http://localhost:8080/spring-mvc-basics/employee/10

Давайте теперь рассмотрим настройку этой стратегии – как с конфигурациями Java, так и с конфигурациями XML.

3.1. Конфигурация Java

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(true).
    favorParameter(false).
    ignoreAcceptHeader(true).
    useJaf(false).
    defaultContentType(MediaType.APPLICATION_JSON); 
}

Давайте обсудим детали.

Во-первых, мы включаем стратегию расширения пути. Также стоит упомянуть , что начиная с Spring Framework 5.2.4 метод favorPathExtension(boolean) устарел, чтобы препятствовать использованию расширений путей для согласования содержимого.

Затем мы отключаем стратегию параметров URL, а также стратегию Accept header, потому что мы хотим полагаться только на способ расширения пути для определения типа содержимого.

Затем мы отключаем платформу активации Java; JAF можно использовать в качестве резервного механизма для выбора формата вывода, если входящий запрос не соответствует ни одной из настроенных нами стратегий. Мы отключаем его, потому что собираемся настроить JSON в качестве типа контента по умолчанию. Обратите внимание, что метод use Jaf() устарел с версии Spring Framework 5 .

И, наконец, мы устанавливаем JSON по умолчанию. Это означает, что если ни одна из двух стратегий не будет согласована, все входящие запросы будут сопоставлены методу контроллера, который обслуживает JSON.

3.2. Конфигурация XML

Давайте также быстро рассмотрим ту же самую точную конфигурацию, только с использованием XML:


    
    
    
    
    

4. Стратегия параметров URL

Мы использовали расширения пути в предыдущем разделе – теперь давайте настроим Spring MVC, чтобы использовать параметр пути.

Мы можем включить эту стратегию, установив значение свойства favorParameter равным true.

Давайте быстро посмотрим, как это будет работать с нашим предыдущим примером:

curl http://localhost:8080/spring-mvc-basics/employee/10?mediaType=json

И вот каким будет тело ответа JSON:

{
    "id": 10,
    "name": "Test Employee",
    "contactNumber": "999-999-9999"
}

Если мы используем параметр XML, вывод будет в виде XML:

curl http://localhost:8080/spring-mvc-basics/employee/10?mediaType=xml

Орган реагирования:


    999-999-9999
    10
    Test Employee

Теперь давайте сделаем конфигурацию – снова, сначала используя Java, а затем XML.

4.1. Конфигурация Java

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(false).
    favorParameter(true).
    parameterName("mediaType").
    ignoreAcceptHeader(true).
    useJaf(false).
    defaultContentType(MediaType.APPLICATION_JSON).
    mediaType("xml", MediaType.APPLICATION_XML). 
    mediaType("json", MediaType.APPLICATION_JSON); 
}

Давайте ознакомимся с этой конфигурацией.

Во-первых, конечно, расширение пути и стратегии Accept header отключены (как и JAF).

Остальная конфигурация такая же.

4.2. Конфигурация XML


    
    
    
    
    
    

    
        
            
            
        
    

Кроме того, мы можем включить обе стратегии (расширение и параметр) одновременно:

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(true).
    favorParameter(true).
    parameterName("mediaType").
    ignoreAcceptHeader(true).
    useJaf(false).
    defaultContentType(MediaType.APPLICATION_JSON).
    mediaType("xml", MediaType.APPLICATION_XML). 
    mediaType("json", MediaType.APPLICATION_JSON); 
}

В этом случае Spring сначала будет искать расширение пути, если его нет, то будет искать параметр пути. И если оба они недоступны в запросе на ввод, то тип контента по умолчанию будет возвращен обратно.

5. Стратегия Принятия заголовка

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

Мы должны установить значение ignoreAcceptHeader в false, чтобы включить этот подход, и мы отключаем две другие стратегии только для того, чтобы мы знали, что полагаемся только на заголовок Accept .

5.1. Конфигурация Java

public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorPathExtension(true).
    favorParameter(false).
    parameterName("mediaType").
    ignoreAcceptHeader(false).
    useJaf(false).
    defaultContentType(MediaType.APPLICATION_JSON).
    mediaType("xml", MediaType.APPLICATION_XML). 
    mediaType("json", MediaType.APPLICATION_JSON); 
}

5.2. Конфигурация XML


    
    
    
    
    
    

    
        
            
            
        
    

Наконец, нам нужно включить contentnegotiationmanager, подключив его к общей конфигурации:


6. Заключение

И мы закончили. Мы рассмотрели, как работает согласование контента в Spring MVC, и сосредоточились на нескольких примерах настройки, чтобы использовать различные стратегии для определения типа контента.

Полную реализацию этой статьи можно найти на GitHub .