Spring Cloud Brixton Release Train 的第一个里程碑现已可用

发布 | Spencer Gibb | 2015 年 9 月 16 日 | ...

我谨代表 Spring Cloud 团队,非常高兴地宣布 Spring Cloud Brixton release train 的第一个里程碑。该里程碑现已可用,可在我们的 Spring Milestone 仓库 中找到。我们进行了大量的增强和错误修复,其中一些亮点包括:

  • 支持 Spring Boot 1.3.x 和 Spring 4.2.x
  • 集群领导选举和锁
  • Hashicorp Consul 支持服务注册/发现、配置和总线
  • Apache Zookeeper 支持服务注册/发现、配置和领导选举
  • Lattice 支持服务注册/发现
  • 分布式跟踪支持

本周 Spring - 2015 年 9 月 15 日 - SpringOne2GX 2015 版!

工程 | Josh Long | 2015 年 9 月 16 日 | ...

欢迎收看又一期《本周 Spring》!本周,我们在美丽的华盛顿特区参加盛大的 SpringOne2GX 2015

这是一个精彩绝伦的活动,充满了精彩、关键的时刻,有来自 Rakuten、Alibaba 和 Netflix 等全球最大网站的工程师在内的千余名与会者加入我们华盛顿特区的旅程,学习和热爱 Pivotal 在 Spring 及周边领域的所作所为。

以下是我最喜欢的几个时刻

get cloud native

  • 今年,Pivotal 将云原生推向了前所未有的高度和速度,SpringOne2GX 是一场对这种驱动力的盛大庆典:GET CLOUD NATIVE。

React.js 和 Spring Data REST:第二部分 - 超媒体

工程 | Greg L. Turnquist | 2015 年 9 月 15 日 | ...
要查看此代码的更新,请访问我们的 React.js 与 Spring Data REST 教程

上一节中,您了解了如何使用 Spring Data REST 搭建后端工资服务来存储员工数据。它缺少的一个关键功能是使用超媒体控件和通过链接进行导航。相反,它硬编码了查找数据的路径。

您可以随时从该存储库获取代码并跟随学习。本节基于上一节的应用,并添加了一些额外内容。

起初只有数据……然后才有了 REST

我发现很多人称任何基于 HTTP 的接口为 REST API,这让我感到沮丧。今天的例子是 SocialSite REST API。那是 RPC。它充满了 RPC 的味道……。为了让 REST 架构风格清晰地表明超文本是一个约束,需要做什么?换句话说,如果应用程序状态(因此 API)的引擎不是由超文本驱动的,那么它就不是 RESTful 的,也不能是 REST API。句号。是否有某个坏掉的手册需要修复?

那么,超媒体控件,即超文本,究竟是什么?以及如何使用它们?要找出答案,让我们退一步,看看 REST 的核心使命。

REST 的概念是借鉴那些使 Web 如此成功的思想,并将它们应用于 API。尽管 Web 规模庞大、动态性强,而且客户端(如浏览器)的更新速度缓慢,但 Web 却取得了巨大的成功。Roy Fielding 试图利用它的一些约束和特性,看看这是否能带来类似的 API 生产和消费的扩展。

其中一个约束是限制动词的数量。对于 REST,主要的动词是 GET、POST、PUT、DELETE 和 PATCH。还有其他一些,但我们在这里就不深入讨论了。

  • GET - 在不改变系统的情况下获取资源的状态
  • POST - 创建一个新资源,但不指定位置
  • PUT - 替换现有资源,覆盖已有的任何内容(如果有的话)
  • DELETE - 删除现有资源
  • PATCH - 部分修改现有资源

这些是标准化的 HTTP 动词,并有完善的规范。通过采用并使用已有的 HTTP 操作,我们不必发明新的语言并教育行业。

REST 的另一个约束是使用媒体类型来定义数据格式。与其让每个人都编写自己的信息交换方言,不如开发一些媒体类型会更明智。其中最受欢迎的之一是 HAL,媒体类型为 application/hal+json。它是 Spring Data REST 的默认媒体类型。一个关键的价值是,REST 没有中心化的、单一的媒体类型。相反,人们可以开发媒体类型并插入它们。尝试一下。随着不同需求的出现,行业可以灵活地发展。

REST 的一个关键特性是包含相关资源的链接。例如,如果您正在查看一个订单,RESTful API 将包含一个指向相关客户的链接、指向商品目录的链接,以及可能指向订单所在商店的链接。在本节中,您将介绍分页,并了解如何使用导航分页链接。

从后端启用分页

为了开始使用前端超媒体控件,您需要启用一些额外的控件。Spring Data REST 提供分页支持。要使用它,只需调整存储库定义。

src/main/java/com/greglturnquist/payroll/EmployeeRepository.java
public interface EmployeeRepository extends PagingAndSortingRepository<Employee, Long> {

}

您的接口现在扩展了 PagingAndSortingRepository,它提供了设置页面大小的额外选项,并添加了从页面跳转到页面的导航链接。后端其余部分相同(除了一些额外的预加载数据以增加趣味性)。

重启应用程序 (./mvnw spring-boot:run) 并查看其工作原理。

$ curl localhost:8080/api/employees?size=2
{
  "_links" : {
    "first" : {
      "href" : "https://:8080/api/employees?page=0&size=2"
    },
    "self" : {
      "href" : "https://:8080/api/employees"
    },
    "next" : {
      "href" : "https://:8080/api/employees?page=1&size=2"
    },
    "last" : {
      "href" : "https://:8080/api/employees?page=2&size=2"
    }
  },
  "_embedded" : {
    "employees" : [ {
      "firstName" : "Frodo",
      "lastName" : "Baggins",
      "description" : "ring bearer",
      "_links" : {
        "self" : {
          "href" : "https://:8080/api/employees/1"
        }
      }
    }, {
      "firstName" : "Bilbo",
      "lastName" : "Baggins",
      "description" : "burglar",
      "_links" : {
        "self" : {
          "href" : "https://:8080/api/employees/2"
        }
      }
    } ]
  },
  "page" : {
    "size" : 2,
    "totalElements" : 6,
    "totalPages" : 3,
    "number" : 0
  }
}

默认页面大小为 20,因此要使其生效,请应用 ?size=2。正如预期的那样,只列出了两名员工。此外,还有一个 firstnextlast 链接。还有一个 self 链接,没有上下文包括页面参数

如果您导航到 next 链接,您将看到 prev 链接

$ curl "https://:8080/api/employees?page=1&size=2"
{
  "_links" : {
    "first" : {
      "href" : "https://:8080/api/employees?page=0&size=2"
    },
    "prev" : {
      "href" : "https://:8080/api/employees?page=0&size=2"
    },
    "self" : {
      "href" : "https://:8080/api/employees"
    },
    "next" : {
      "href" : "https://:8080/api/employees?page=2&size=2"
    },
    "last" : {
      "href" : "https://:8080/api/employees?page=2&size=2"
    }
  },
...
注意
在 URL 查询参数中使用 "&" 时,命令行会将其视为换行符。用引号将整个 URL 括起来以绕过此限制。

这看起来很不错,但当您更新前端以利用它时,会更好。

按关系导航

就是这样!后端无需再进行任何更改即可开始使用 Spring Data REST 开箱即用的超媒体控件。您可以切换到处理前端。(这是 Spring Data REST 的优点之一。无需杂乱的控制器更新!)

注意
需要指出的是,此应用程序并非“Spring Data REST 特定”。相反,它使用了HALURI Templates 等标准。这就是 rest.js 如此易用的原因:该库自带 HAL 支持。

在上一节中,您硬编码了到 /api/employees 的路径。相反,您应该硬编码的唯一路径是根目录。

...
var root = '/api';
...

有了这个方便的小follow() 函数,您现在可以从根目录开始导航到您需要的地方!

componentDidMount: function () {
    this.loadFromServer(this.state.pageSize);
},

在上一节中,加载是直接在 componentDidMount() 中完成的。在本节中,我们实现了当页面大小更新时重新加载整个员工列表的功能。为此,我们已将内容移至 loadFromServer()

loadFromServer: function (pageSize) {
    follow(client, root, [
        {rel: 'employees', params: {size: pageSize}}]
    ).then(employeeCollection => {
        return client({
            method: 'GET',
            path: employeeCollection.entity._links.profile.href,
            headers: {'Accept': 'application/schema+json'}
        }).then(schema => {
            this.schema = schema.entity;
            return employeeCollection;
        });
    }).done(employeeCollection => {
        this.setState({
            employees: employeeCollection.entity._embedded.employees,
            attributes: Object.keys(this.schema.properties),
            pageSize: pageSize,
            links: employeeCollection.entity._links});
    });
},

loadFromServer 与上一节非常相似,但它使用 follow()

  • follow() 函数的第一个参数是用于发出 REST 调用的 client 对象。
  • 第二个参数是开始的根 URI。
  • 第三个参数是要沿其导航的关系数组。每个关系都可以是字符串或对象。

关系数组可以很简单,例如 ["employees"],这意味着在第一次调用时,在 _links 中查找名为 employees 的关系(或 rel)。找到它的 href 并导航到它。如果数组中有另一个关系,则重复此过程。

有时,仅凭 rel 并不够。在此代码片段中,它还插入了一个查询参数 ?size=<pageSize>。还有其他选项可以提供,您将在后续内容中看到。

获取 JSON Schema 元数据

在通过基于大小的查询导航到 employees 后,employeeCollection 触手可及。在上一节中,我们将其称为 day 并将该数据显示在 <EmployeeList /> 中。今天,您将执行另一个调用来获取在 /api/profile/employees 找到的一些JSON Schema 元数据

您自己可以看到数据

$ curl https://:8080/api/profile/employees -H 'Accept:application/schema+json'
{
  "title" : "Employee",
  "properties" : {
    "firstName" : {
      "title" : "First name",
      "readOnly" : false,
      "type" : "string"
    },
    "lastName" : {
      "title" : "Last name",
      "readOnly" : false,
      "type" : "string"
    },
    "description" : {
      "title" : "Description",
      "readOnly" : false,
      "type" : "string"
    }
  },
  "definitions" : { },
  "type" : "object",
  "$schema" : "https://schema.json.js.cn/draft-04/schema#"
}
注意
/profile/employees 处的元数据的默认形式是 ALPS。在这种情况下,您正在使用内容协商来获取 JSON Schema。

通过将此信息捕获在 `<App />` 组件的状态中,您可以在以后构建输入表单时充分利用它。

创建新记录

有了这些元数据,您现在可以在 UI 中添加一些额外的控件。创建一个新的 React 组件 <CreateDialog />

var CreateDialog = React.createClass({
handleSubmit: function (e) {
    e.preventDefault();
    var newEmployee = {};
    this.props.attributes.forEach(attribute =&gt; {
        newEmployee[attribute] = React.findDOMNode(this.refs[attribute]).value.trim();
    });
    this.props.onCreate(newEmployee);

    // clear out the dialog's inputs
    this.props.attributes.forEach(attribute =&gt; {
        React.findDOMNode(this.refs[attribute]).value = '';
    });

    // Navigate away from the dialog to hide it.
    window.location = "#";
},

render: function () {
    var inputs = this.props.attributes.map(attribute…

Spring AMQP 1.5.0 发布

发布 | Gary Russell | 2015 年 9 月 10 日 | ...

我们很高兴地宣布 Spring AMQP 的 1.5.0.RELEASE 版本现已可用。

请参阅 发行说明,了解自发布候选版本宣布以来应用的一些更改。

请参阅 发布候选版本公告参考文档“新增内容”,了解发布内容的完整详细信息。

请参阅 项目页面 以获取下载、文档等的链接。## SpringOne 2GX 2015 即将到来!请预订您的 下周在华盛顿特区举行的 SpringOne2GX 的名额。这是第一时间了解所有动态并提供直接反馈的最佳机会。

Spring Integration 4.2 发布

发布 | Gary Russell | 2015 年 9 月 10 日 | ...

我们很高兴地宣布 Spring Integration 的 4.2.0.RELEASE 版本现已可用。

请参阅 发行说明,了解自发布候选版本宣布以来应用的一些更改。

请参阅 发布候选版本公告参考文档“新增内容”,了解发布内容的完整详细信息。

请参阅 项目页面 以获取下载、文档等的链接。

## SpringOne 2GX 2015 即将到来!请预订您的 下周在华盛顿特区举行的 SpringOne2GX 的名额。这是第一时间了解所有动态并提供直接反馈的最佳机会。

Spring Integration Java DSL 1.1 M2 现已可用

发布 | Artem Bilan | 2015 年 9 月 10 日 | ...

我们很高兴地宣布 Spring Integration Java DSL 的 Milestone 2 现已可从 Milestone 仓库 获取

Gradle 使用方式如下:

compile "org.springframework.integration:spring-integration-java-dsl:1.1.0.M2"

对于 Maven,请使用此依赖项

<dependency>
     <groupId>org.springframework.integration</groupId>
     <artifactId>spring-integration-java-dsl</artifactId>
     <version>1.1.0.M2</version>
</dependency>

Milestone 1 以来,新增功能并不多,但以下是最需要关注的重要事项:

Spring Integration 4.2 基础

Spring Integration Java DSL 1.1 现在基于 Spring Integration 4.2,即将成为即将推出的 Spring IO 2.0 的一部分……

本周 Spring 动态 - 2015 年 9 月 8 日

工程 | Josh Long | 2015 年 9 月 8 日 | ...

欢迎来到另一期本周 Spring!本周我离开了日本东京,在中国上海,与几家大型初创公司进行了交流——包括在中国竞争激烈、每天有超过 200 万订单的中国最大的食品配送服务和应用程序——Ele.me——讨论如何使用 Spring Boot、Spring Cloud 和 Cloud Foundry 构建云原生应用程序!明天,将前往挪威奥斯陆,参加精彩的 JavaZone 会议。我喜欢这次会议,并且在过去两年中,由于与 SpringOne2GX 同时举行而无法参加……

Spring REST Docs 1.0.0.RC1

工程 | Andy Wilkinson | 2015 年 9 月 8 日 | ...

我很高兴地宣布 Spring REST Docs 1.0.0.RC1 已发布,可从我们的里程碑存储库获取。

如果您想了解使用 Spring REST Docs 生成的内容示例,请查看示例文档

有什么新内容

开始…

Spring Data Gosling 版本有哪些新特性?

工程 | Christoph Strobl | 2015年9月4日 | ...

在 12 个项目中修复了 300 多个问题,要跟踪自上次发布以来发生的变化非常困难。因此,这里对我们在最近一个迭代中准备的一些新功能进行更详细的摘录。

临时 JPA 获取图。

自 Dijkstra 版本以来,我们能够通过 JPA 支持的存储库中的 @EntityGraph 注解引用实体上声明的命名实体图。在下面的示例中,这强制首字母和姓氏被贪婪加载,而其他所有内容保持惰性加载。

@Entity
@NamedEntityGraphs(
  @NamedEntityGraph(name…

Spring Boot 1.3.0.M5 现已发布

发布 | Phil Webb | 2015年9月4日 | ...

Spring Boot v1.3.0.M5 现已在 Spring milestone repository 上可用。恰逢 SpringOne 2GX,此版本解决了 近 50 个问题,并合并了 15 个 pull-requests!再次感谢所有贡献者。

新版本亮点包括:

  • 在迈向 RC1 的过程中,进行了大量的错误修复和稳定性改进
  • 支持 javax @WebServlet@WebFilter@WebListener 注解
  • Hazelcast 自动配置
  • 改进的“先根节点”异常日志记录

有关更改的完整列表和升级说明,请参阅 wiki 上的 Spring Boot 1.3 发行说明以及更新的 参考文档……

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有