Первоначально автор Джош Лонг в блоге SpringSource
Мы с Роем Кларксоном (@royclarkson) выступили на SpringOne2GX 2013 с докладом о создании REST-сервисов, ориентированных на их использование на мобильных платформах, таких как Android и iOS. Этот доклад демонстрирует прогрессивную эволюцию приложения с использованием Spring MVC, Spring HATEOAS, Spring Data REST, Spring Security, Spring Security OAuth и Spring Android. Код получил большую помощь от Роба Винча,
Макет кодекса
Код для выступления находится на моей учетной записи GitHub (github.com/joshlong/**the-spring-rest-stack**) . Важно отметить, что код живет в code
каталоге. Под ним есть два варианта: web
(где вы будете найти rest
, hateoas
, hateoas-data
, и oauth
, social
модули) и client
(где вы можете загрузить Android модуль и модуль IOS). Модули в web
папке в соответствующем порядке демонстрируют эволюцию простого сервиса REST, который включает в себя гипермедиа, репозитории Spring Data и безопасность OAuth. social
Модуль демонстрирует , как создать клиент OAuth , который потребляет услугу.
Создание и редактирование кода
На данный момент проект полностью основан на Maven, хотя переход на Gradle кажется неизбежным, поскольку это одобренный Google маршрут для сборок Android. Я знаю, что клиент Android можно импортировать и создавать с помощью поддержки Android IntelliJ IDEA (которая теоретически должна работать в Android Studio , которая доступна бесплатно).
Зависимость Dance и Android
Мы использовали последние версии основных библиотек в нашем файле компоновки, ссылки на которые приведены для справки . Современный и иногда кровоточащий край. Приложение Android использует проект Spring Android, который — в основном — обеспечивает API-совместимую реализацию RestTemplate
ядра Spring.
Тем не менее, он не обеспечивает всю инфраструктуру, и если вы привнесете определенные библиотеки из ядра, вы получите странные проблемы, потому что некоторые классы в модулях Android для Android в основном одинаковы в Spring Android и в ядре, но это не так. идентичны, из-за разной природы среды, в которой они работают. Самый простой способ убедиться, что все в порядке, — это явное исключение всех модулей Spring, кроме зависимостей Spring Android, а затем выборочное повторение типов по мере необходимости.
Типы в модуле Spring Android RestTemplate обеспечивают более чем достаточную совместимость, чтобы позволить клиентской машине Spring Social работать на Android без изменений. Это, конечно, означает, что мы можем использовать OAuth-клиент Spring Social в social
модуле нашего приложения для Android. Потрясающие!
Например, в то время как мне были нужны основные типы и реализации Spring Social, мне не нужны были основные библиотеки Spring, которые он ввел. Итак, мы получаем довольно драматический раздел:
<dependency> <groupId>org.springframework.social</groupId> <artifactId>spring-social-core</artifactId> <version>${spring-social.version}</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </exclusion> <exclusion> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> </exclusion> <exclusion> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> </exclusion> <exclusion> <groupId>com.joshlong.restfuliterations</groupId> <artifactId>services</artifactId> </exclusion> </exclusions> </dependency>
Эти зависимости могут быть трудно найти. Используйте mvn dependency:tree
команду, чтобы увидеть, где вещи импортируются транзитивно . В Spring Security, еще одной библиотеке, для которой нам нужны типы верхнего уровня CLASSPATH
, также требовались exclusion
элементы, поскольку она перетаскивается в ядро Spring.
Некоторые классы — например, JAXB — вы просто не можете избежать
Любой класс, которого нет в белом списке JDK-классов Android, недоступен на Android и, следовательно, делает код, который зависит от него, несовместимым. Некоторые классы, такие как в модуле JAXB, трудно игнорировать, поскольку они распространены. Я хотел использовать Spring HATEOAS Resource
, Link
, тип. Эти типы используются в качестве представлений различных объектов в ответах REST, которые иногда отображаются как XML с использованием JAXB, их нельзя было загрузить в Android! Поэтому мне пришлось скопировать эти типы локально, отразить структуру пакета и удалить некорректные аннотации. Надеюсь, я смогу это исправить в будущем.