Работа с JSON и XML (преобразование объектов) в Spring MVC. Формирование ответа и обработка запроса

Работа с JSON и XML (преобразование объектов) в Spring MVC. Формирование ответа и обработка запроса (RESTful веб-сервис). Применение RestTemplate в Spring MVC.

Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Используемые технологии и библиотеки
  • Spring MVC 4.2.4.Release
  • JAXB API 2.2.10
  • IntelliJ IDEA 15.0.2

1. Описание задачи

В этой части будет рассмотрена работа приложения Spring MVC с форматами JSON и XML (RESTful веб-сервис). Будет показана возможность преобразовывать Java объекты в эти форматы, а так же формировать ответ в JSON или XML виде на запрос клиента. Для примера будет использован сторонний источник данных (внешний интернет ресурс), который будет предоставлять данные в том или ином формате. Таким образом здесь мы рассмотрим:

  • Преобразование POJO (Plain Old Java Object) объектов в формат XML
  • Преобразование POJO объектов в формат JSON
  • Использование аннотаций @ResponseBody, @RestController, @XmlRootElement, @XmlElement
  • Использование RestTemplate

2. Структура проекта

MCRestStructure

Классы находятся в пакете rest. Во вложенном пакете model находятся классы объектов, которые мы будем преобразовывать в XML или JSON формат (DBLogJSONDBLogsXMLRestPostsModelRestUserModel и т.д.). На уровень выше находятся два контроллера (RestController и RestTemplateController), которые будут демонстрировать различные способы работы с REST сервисами. Например, класс RestTemplateController обращается к внешнему сайту (http://jsonplaceholder.typicode.com), который возвращает данные в ответ на запросы, посылаемые нашим приложением.

Создан один файл представление — rest.jsp из одноименного пакета. На этой страничке будет доступен вызов того или иного метода из контроллеров.

3. pom.xml

Отдельной строкой была добавлена зависимость Java Architecture for XML Binding (JAXB). Этот пакет входит в Java SE и можно было бы его не добавлять для этого проекта, но здесь было выделить его в учебных целях.

Так же в предыдущих статьях была добавлена библиотека от Spring для работы с Rest JSON Processing API:

Аннотации вроде @RestController доступны из общего пакета spring web mvc.

4. Конфигурация Spring MVC

В application-context была добавлена запись, которая описывает бин restTemplate. Описание этого класса будет немного ниже.

application-context.xml:

В конфигурационный файл mvc-config.xml была добавлена настройка mvc:message-converters, в которой задан бин MappingJackson2HttpMessageConverter с атрибутом prettyPrint. Этот бин и атрибут позволяет получать JSON ответ в форматированном виде (легче читается человеком).

mvc-config.xml:

Каких-либо других настроек специально для работы с REST сервисами и преобразованием объектов в XML\JSON форматы не требуется.

5. Контроллер RestController

Для демонстрации работы по преобразованию обычных java классов в xml или JSON форматы был создан обычный Spring controller класс — RestController.

Вначале указываем приложению, что этот класс является контроллером с помощью аннотации @Controller. Затем используя автосвязывание @Autowired получаем доступ к классу DBLogService. Этот сервисный класс предоставляет методы для доступа к данным из нашей встроенной in-memory H2 базы данных. Откуда берутся данные было описано в предыдущих статьях (смотрите Spring MVC и JDBC (Spring JDBC example). Подключение и настройка JDBC datasource, пример работы с JDBC в Spring).

DBLogService:

Над методами указывается атрибут produces, который указывает в какой формат данных должен быть преобразован ответ метода. Указание на то, что ответ должен быть преобразован в JSON или XML формат дает аннотация @ResponseBody. Теперь рассмотрим POJO классы объектов данных.

6. POJO классы

Для того, чтобы преобразование класса в XML формат прошло успешно, нам необходимо использовать аннотации @XmlRootElement и\или @XmlElement. Для JSON формата ничего дополнительно в классе указывать не нужно!

У нас используется несколько java классов, которые будут преобразовываться в xml или json ответ клиенту: DBLogJSON, DBLogsJSON, DBLogXML, DBLogsXML, RestPostsModel, RestUserModel. DBLog — класс, который имеет две переменных экземпляра — id, и строку (с описанием логов). Два последних класса RestPostModel и RestUserModel — классы, которые используются для отображения данных со стороннего ресурса и будут описаны в пункте по RestTemplate. Т.к. для JSON формата никаких аннотаций или дополнительных манипуляций с классом не требуется, то рассмотрим только классы с суффиксом XML.

DBLogXML:

Тут следует обратить внимание на аннотацию @XmlElement. С помощью нее класс будет преобразовывать переменные экземпляра в XML элемент. Остальные аннотации относятся к маппингу таблицы из базы данных на сущность. Если нам необходимо показать список элементов, то мы можем использовать аннотацию @XmlRootElement, который задаст корневой элемент, а далее с помощью указания @XmlElement будут отображены все объекты массива.

DBLogsXML:

Объекты с суффиксом JSON точно такие же, только без указания аннотаций относящихся к XML.

7. RestTemplate

Класс RestTemplate — служит для доступа к REST данным на удаленном веб сервере. Это своего рода аналог JDBCTemplate (Spring MVC и JDBC (Spring JDBC example). Подключение и настройка JDBC datasource, пример работы с JDBC в Spring). Напомню, что бин RestTemplate был прописан в файле конфигурации Spring в начале статьи. Мы будем использовать сгенерированный ответ со стороннего веб сервера (http://jsonplaceholder.typicode.com). Он будет генерировать объекты вроде «Посты пользователя» или «Пользователь (описание)». Контроллер, который будет демонстрировать работу с RestTemplate и обработку данных с внешнего веб сервера выглядит так:

RestTemplateController:

Сразу можно обратить внимание на аннотацию @RestController. Такая запись автоматически добавляет аннотацию @ResponseBody во все методы внутри класса. Далее с помощью связывание мы получаем доступ к объекту RestTemplate, с помощью которого мы будем преобразовывать данные ответа внешнего сервера (который указан в переменной EXTERNAL_REST_URL).

Далее следует обратить внимание на метод restTemplate.getForEntity(). С помощью этого метода мы преобразовываем REST ответ сервера в нашу сущность.

А вот и сам класс сущность для маппинга ответа с внешнего сервера. RestPostsModel:

Как видите это просто обычный java класс с несколькими полями.

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

В этой части не буду приводить описание jsp страницы, т.к. на ней нет ничего отличного от предыдущих частей. Вы можете ее посмотреть скачав приложение в конце статьи. Перейдем к просмотру того, что у нас выдает наше приложение.

restPage

8.1. Преобразование объекта в XML\JSON

Так у нас выглядят объекты JSON и XML.

JSON (по кнопке Get DBLogs JSON):

restJSONObj

XML (по кнопке Get DBLogs XML):

restXMLObj

А так выглядит обработка результатов с помощью RestTemplate (кнопка Get Rest Users):

restTemplateObj

Так же вы могли заметить методы по возврату поста по ID, удаление поста. Эти методы демонстрируют работу других методов, которые могут быть использованы в RESTful веб сервисах. Их реализацию можете посмотреть внутри проекта.

 

Исходные коды

MVC_AngularJS_Html5 full project — полный проект Spring MVC + AngularJS + Bootstrap + HTML5.

16. Rest and JSON (JPA and JDBC) — код для этой части

Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Share Button
7
26318 Total Views 3 Views Today

13 thoughts on “Работа с JSON и XML (преобразование объектов) в Spring MVC. Формирование ответа и обработка запроса

  1. Андрей:

    Здравствуйте! Очень интересные статьи, все прочитал. Но не нашёл описания того, как получить и обработать данные в формате json, которые приходят из браузера. Как это можно сделать?

    1. Существует достаточно много библиотек по преобразованию JSON в POJO. Можете посмотреть Jackson, Gson и т.д.

  2. grob:

    Выскакивает эта ошибка:

    ExceptionHandler msg: org.springframework.web.client.HttpClientErrorException: 403 Forbidden

     

    1. Степан Пельмегов:

      Как вы решили проблему?

      1. Решено с помощью комментария Андрея ниже.

  3. Степан Пельмегов:

    Обращение к автору статьи, уже 5 день с проблемой разбираюсь, ничего не помогает.

    По порядку опишу что делал и что в итоге вышло. Сделал все как вы писали в статье, полностью весь код проверил несколько раз, все должно функционировать. Но, выкидывает 403 ошибку и все тут. То есть перехожу на rest.html , жмякаю на ссылку для того чтобы принять json с сервера и получаю 403 ошибку.

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

    но это в конфиге присутсвтует.
    Далее я вообще закомментировал все настройки секьюрити, убрал фильтр в web.xml , удалил все зависимости из pom.xml , почистил любые сведения о секьюрити в jsp’шках. Бесполезно, 403 ошибка.
    Дебаг ничего не дал, в метод контроллера запрос тупо не доходит.

    Вот такая вот проблема, как можно решить?)

    1. Попробуйте скачать исходник и его запустить (на томкате проверялся). Если работает, то потихоньку сравнивайте ваш код и проектный. Если не работает, то проверяйте окружение.

      1. Степан Пельмегов:

        Исходник скачал, запустил, проблема та же самая. Что конкретно можно проверить, не подскажете?

      2. Степан Пельмегов:

        К тому же стало понятно, что если обращаться к /rest/users например то крах происходит в данном месте

        1. Можете не мучиться — сайт действительно больше не выдает ответ на код из этой статьи. Добавил комментарий вначале, чтобы другие не страдали:) Всё что нужно выяснить это что нужно той стороне, чтобы ответить на запрос (возможно добавить какую-то информацию в header или что-то такое). Кстати быстро глянул и на запрос по сайту из URL (jsonplaceholder.typicode.com) и комбинации с spring RestTemplate люди сталкивались с этой бедой, возможно там где-то есть решение.

          1. Решено с помощью комментария Андрея.

  4. Андрей:

     
    Сайт jsonplaceholder.typicode.com проверяет http заголовки, в частности User-Agent.

    Нужно немного поправить код:

    1. Спасибо! Поправил код и текст в статье.

Добавить комментарий