Как Spring MVC находит Jackson

0
01 янв 2017 20:11
Здравствуйте и с Новым Годом:)

Я сделал простое REST приложение на Spring. На клиентской стороне jQuery делает ajax-запросы к серверу.

Это фрамгмент JS-скрипта, он не так важен, просто привел его чтобы показать, что от сервера ожидается JSON.
   var RESTGet = function () {
    $.ajax({
        type: 'GET',
        url: prefix + '/' + Date.now(),
        dataType: 'json',
        async: 'true',

       ...
    });
}


Это фрагмент контроллера, который обрабатывает приведенный выше клиентский запрос
@RequestMapping(value = "/{time}", method = RequestMethod.GET)
@ResponseBody
public MyDataObject getMyData(@PathVariable long time) {
      return new MyDataObject(Calendar.getInstance(), "Это ответ метода GET");
}


Как видно контроллер возвращает тип MyDataObject.

Запускаю проект - понятное дело ничего не работает, поскольку нет никакого конвертора в JSON.

Тогда я в Maven подключаю зависимости
        <!--https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.8.5</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.8.5</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.5</version>
        </dependency>


И вот теперь почему-то проект запускается и работает! Но я не создавал никаких классов или бинов для конвертирования в JSON, не делал никаких настроек - только подключил зависимости.

Получается что Jackson как-то автоматически осуществил преобразование? Почему проект заработал только лишь от простого подключения зависимостей?

Ответов: 1

1
01 янв 2017 20:32
Увы со временем Spring начал включать все больше и больше магии - ее не всегда легко определить самому. Так, существует некий org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter который регистрирует конвертеры по умолчанию. Он определяет есть ли класс из предопределенных библиотек в classpath'e, и если есть, то добавляет его в список возможных конвертеров. Среди них Jackson2 на 2ом месте после JAXB:
	public AllEncompassingFormHttpMessageConverter() {
		addPartConverter(new SourceHttpMessageConverter<Source>());

		if (jaxb2Present && !jackson2XmlPresent) {
			addPartConverter(new Jaxb2RootElementHttpMessageConverter());
		}

		if (jackson2Present) {
			addPartConverter(new MappingJackson2HttpMessageConverter());
		}
		else if (gsonPresent) {
			addPartConverter(new GsonHttpMessageConverter());
		}

		if (jackson2XmlPresent) {
			addPartConverter(new MappingJackson2XmlHttpMessageConverter());
		}
	}
Модераторы: Нет
Сейчас эту тему просматривают: Нет