Статьи

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

1. Введение

Что мы сделали с BeanNameViewResolver , так это то, что мы только что создали несколько представлений bean-компонентов в контексте Spring для генерации ожидаемого результата. Вскоре Spring представил стратегию согласования контента , в которой мы можем использовать традиционный подход RESTful @ResponseBody и конвертеры HTTP-сообщений, чтобы возвращать желаемые выходные данные в формате JSON или XML, а также некоторую гибкость и динамичность, которые он обеспечивает в конфигурации.

Часто нам необходимо предоставить несколько представлений (или представлений) одних и тех же данных, возвращаемых контроллером. Это очень элегантно достигается с помощью согласования контента весной.

2. Реализация

Чтобы быстро начать реализацию, давайте сначала создадим новый проект maven. Нажмите здесь, чтобы получить помощь по созданию вашего нового проекта Maven в Eclipse

Давайте теперь добавим необходимые зависимости в файл pom.xml .

pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!-- Spring dependencies -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>4.2.1.RELEASE</version>
</dependency>
  
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.2.1.RELEASE</version>
</dependency>
  
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.2.1.RELEASE</version>
</dependency>
  
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.6</version>
</dependency>
<dependency>
    <groupId>javax.xml</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.1</version>
</dependency>
  
<!-- Jackson JSON Processor -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.4.1</version>
</dependency>

Откройте web.xml и убедитесь, что вы правильно настроили конфигурацию.

web.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="ISO-8859-1"?>
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    id="WebApp_ID" version="2.5">
  
    <display-name>SpringMVCWithContentNegotiation</display-name>
  
    <servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
  
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
  
</web-app>

Создайте новый файл контекста с именем <servlet name> -servlet.xml , который должен быть mvc-dispatcher-servlet.xml со следующим содержимым.

MVC-диспетчерская-servlet.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
  
    <mvc:annotation-driven
        content-negotiation-manager="contentNegotiationManager">
        <mvc:path-matching registered-suffixes-only="true" />
    </mvc:annotation-driven>
  
    <context:component-scan base-package="com.jcombat.controller" />
  
    <!-- To disable path extension check in the path variable of URI -->
    <bean id="contentNegotiationManager"
        class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
        <property name="favorPathExtension" value="true" />
        <property name="ignoreAcceptHeader" value="true" />
        <property name="useJaf" value="false"/>
        <property name="defaultContentType" value="application/json" />
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json" />
                <entry key="xml" value="application/xml" />
            </map>
        </property>
    </bean>
  
    <!-- For Other media types -->
    <bean id="jspViewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
  
</beans>

Обратите внимание, что компонентное сканирование применяется только к пакету com.jcombat.controller, поэтому Spring может автоматически определять контроллер приложения.

При выполнении HTTP-запроса мы можем указать, какой тип ответа мы хотели бы получить, установив свойство заголовка Accept . Но из-за неправильной работы браузеров с заголовками Accept мы в основном предпочитаем игнорировать заголовки Accept в веб-приложениях на основе Spring, которые возвращают выходные данные в форматах, отличных от HTML.

При использовании Java Activation Framework (JAF) нам не нужно явно указывать сопоставления медиа-типов, вместо этого это делается неявно с помощью JAF. Чтобы использовать JAF, нам может потребоваться добавить дополнительную зависимость от activ.jar . Вероятно, мы просто хотим поддерживать два выходных формата, то есть JSON и XML, поэтому мы отказываемся от него и предпочитаем явно указывать отображения медиа-типов.

Теперь пришло время написать контроллер, который должен быть таким, как указано ниже.

EmployeeController.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
package com.jcombat.controller;
  
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
  
import com.jcombat.bean.Employee;
  
@Controller
public class EmployeeController {
  
    @RequestMapping(value = "/employeeData", method = RequestMethod.GET, produces={"application/xml", "application/json"})
    public @ResponseBody Employee getEmployee() {
        Employee employee = new Employee();
        employee.setEmailId("[email protected]");
        employee.setEmpId("123");
        employee.setName("Ajit");
        return employee;
    }
}

3. Полезные ссылки

4. Запуск приложения

Когда мы запускаем приложение, мы видим следующее.

Выход JSON

JSON

Вывод XML

XML

5. Загрузите исходный код

Скачать исходный код

Ссылка: Переговоры по контенту в Spring Framework от нашего партнера JCG Абхиманью Прасада в блоге jCombat .