领先一步
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 构建方式。我知道 Android 客户端可以使用 IntelliJ IDEA 的 Android 支持导入和构建(理论上这应该在免费提供的 Android Studio 中也能工作)。
我们在 构建文件中使用了主要库的最新版本,可供参考。最新,有时甚至是前沿版本。Android 应用使用了 Spring Android 项目,该项目基本上提供了与 Spring core 中 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 core。
任何不在 Android JDK 类白名单中的类都无法在 Android 上使用,因此依赖它的代码将不兼容。有些类,例如 JAXB 模块中的类,因为它们无处不在而难以忽视。我想使用 Spring HATEOAS 的 Resource
、Link
等类型。这些类型在 REST 响应中用作各种实体的表示形式,有时使用 JAXB 渲染为 XML,它们无法在 Android 中加载!因此,我不得不将这些类型复制到本地,并镜像包结构并移除那些导致问题的注解。希望我将来能够清理这个问题。