领先一步
VMware提供培训和认证,以加速您的进步。
了解更多Roy Clarkson (@royclarkson) 和我在 SpringOne2GX 2013 大会上做了一个演讲,我们讨论了构建REST服务的主题,重点是如何在Android和iOS等移动平台上使用这些服务。这个演讲演示了一个应用程序使用Spring MVC、Spring HATEOAS、Spring Data REST、Spring Security、Spring Security OAuth和Spring Android的逐步演变过程。代码受益于Rob Winch的大力帮助,
演讲的代码在我的 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构建方法。我知道可以使用IntelliJ IDEA的Android支持(理论上应该可以在 Android Studio 中使用,该软件是免费提供的)导入和构建Android客户端。
我们在 build 文件(此处提供链接) 中使用了最新版本的 प्रमुख 库。这些版本是最新的,有时甚至是处于开发边缘的版本。Android应用程序使用了Spring Android项目,该项目基本上提供了一个与Spring核心中的RestTemplate
兼容的API实现。
但是,它并没有提供整个框架,如果你从核心代码中引入某些库,你将遇到奇怪的问题,因为Spring Android模块中的一些类在Spring Android和核心代码中 *几乎* 相同,但它们并不完全相同,这是由于它们运行环境的不同性质造成的。确保一切正常的最佳方法是显式排除所有Spring模块, *除了* Spring Android依赖项,然后 *有选择地* 重新引入所需的类型。
在 Spring Android RestTemplate 模块 中的类型提供了足够的兼容性,可以让Spring Social的客户端机制在Android上保持不变。当然,这意味着我们可以在Android应用程序中使用social
模块中基于Spring Social的OAuth客户端。太棒了!
例如,虽然我需要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核心。
任何不在Android JDK类白名单中的类都无法在Android上使用,因此会使依赖它的代码不兼容。某些类,例如JAXB模块中的类,很难忽略,因为它们无处不在。我想使用Spring HATEOAS的Resource
、Link
类型。这些类型用作REST响应中各种实体的表示,有时使用JAXB呈现为XML,它们无法在Android中加载!因此,我 不得不将这些类型本地复制,并镜像包结构并删除有问题的注释。希望将来我可以清理它。