Spring Cloud Brixton 发布列车首个里程碑版本可用

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

我代表 Spring Cloud 团队,很高兴地宣布 Spring Cloud Brixton 发布列车的首个里程碑版本。该里程碑版本现已可用,您可以在我们的 Spring 里程碑仓库 中找到它。我们进行了许多改进和错误修复,一些亮点包括:

  • 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

这是一场令人惊叹的活动,充满了令人惊叹的关键时刻,超过一千名与会者(包括来自全球一些最大网站的工程师,例如乐天、阿里巴巴和 Netflix 等)加入我们在华盛顿特区,学习并热爱 Pivotal 在 Spring 方面所做的一切。

以下是我今年的一些最爱时刻:

get cloud native

  • 今年 Pivotal 在云原生方面取得了比以往任何时候都更快更远的进展,SpringOne2GX 成为对这一驱动力的巨大庆祝:拥抱云原生。

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://127.0.0.1:8080/api/employees?page=0&size=2"
    },
    "self" : {
      "href" : "https://127.0.0.1:8080/api/employees"
    },
    "next" : {
      "href" : "https://127.0.0.1:8080/api/employees?page=1&size=2"
    },
    "last" : {
      "href" : "https://127.0.0.1:8080/api/employees?page=2&size=2"
    }
  },
  "_embedded" : {
    "employees" : [ {
      "firstName" : "Frodo",
      "lastName" : "Baggins",
      "description" : "ring bearer",
      "_links" : {
        "self" : {
          "href" : "https://127.0.0.1:8080/api/employees/1"
        }
      }
    }, {
      "firstName" : "Bilbo",
      "lastName" : "Baggins",
      "description" : "burglar",
      "_links" : {
        "self" : {
          "href" : "https://127.0.0.1:8080/api/employees/2"
        }
      }
    } ]
  },
  "page" : {
    "size" : 2,
    "totalElements" : 6,
    "totalPages" : 3,
    "number" : 0
  }
}

默认页面大小为 20,因此要查看其运行情况,请应用 `?size=2`。正如预期的那样,只列出了两个员工。此外,还有一个 **first**、**next** 和 **last** 链接。还有一个 **self** 链接,不包含上下文(包括页面参数)。

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

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

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

通过关系导航

就是这样!无需对后端进行任何更改即可开始使用 Spring Data REST 开箱即用的超媒体控件。(这就是 Spring Data REST 的优点之一。无需混乱的控制器更新!)

注意
需要注意的是,此应用程序并非“特定于 Spring Data REST”。相反,它使用 HALURI 模板 和其他标准。这就是使用 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=** 的查询参数。还可以提供其他选项,您将在后面看到。

获取 JSON Schema 元数据

使用基于大小的查询导航到 **employees** 后,**employeeCollection** 就在您的指尖。在上一节中,我们完成了这一步并显示了 `<EmployeeList />` 内的数据。今天,您将进行另一次调用以获取在 `/api/profile/employees` 中找到的一些 JSON Schema 元数据

您可以自己查看数据:

$ curl https://127.0.0.1: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://json-schema.fullstack.org.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 万个订单——讨论如何使用 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 多个问题,这使得很难追踪自上次发布以来发生了什么。因此,以下是我们在上次迭代期间开发的一些新功能的更详细摘录。

Ad-hoc JPA 获取图。

自从 Dijkstra 版本发布以来,我们就可以通过 JPA 支持的存储库中的 @EntityGraph 注解引用在实体上声明的命名实体图。在下面的示例中,这强制firstname和lastname 积极加载,而所有其他字段仍然延迟加载。

@Entity
@NamedEntityGraphs(
  @NamedEntityGraph(name…

Spring Boot 1.3.0.M5 现已推出

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

Spring Boot v1.3.0.M5 现已从Spring 里程碑存储库提供。这个版本恰逢 SpringOne 2GX,它关闭了近 50 个问题并合并了15 个拉取请求!再次感谢所有贡献者。

新版本的亮点包括

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

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

获取 Spring Newsletter

通过 Spring Newsletter 保持联系

订阅

领先一步

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

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

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

查看全部