Статьи

Maven Dependency Dance с Spring Android, Spring Social и Spring Security


Первоначально автор Джош Лонг в блоге 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(где вы будете найти  resthateoashateoas-data, и  oauthsocial модули) и 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! Поэтому мне пришлось скопировать эти типы локально,  отразить структуру пакета и удалить некорректные аннотации. Надеюсь, я смогу это исправить в будущем.