Spring 本周看点 - 2015 年 10 月 13 日

工程 | Josh Long | 2015 年 10 月 13 日 | ...

欢迎来到新一期的 Spring 本周看点!本周我将在波兰克拉科夫参加 JDD 大会,然后前往俄罗斯圣彼得堡参加 Joker 大会

我们有很多内容要介绍,让我们开始吧!

STS 中的 Spring Boot Dashboard - 第 1 部分:本地 Boot 应用程序

工程 | Martin Lippert | 2015 年 10 月 08 日 | ...

欢迎 Spring 社区的朋友们,

这是介绍 STS 中新的 Spring Boot Dashboard 的三篇博客文章中的第一篇。您将了解如何在 IDE 中使用 Spring Boot Dashboard,了解它提供的各种功能,以及它如何在您开发基于 Spring Boot 的应用程序时提供帮助。由于 Spring Boot Dashboard 是在最近发布的 STS 3.7.1 中引入的,因此您需要该版本才能继续阅读本系列博客。如果您尚未安装,请访问 https://springframework.org.cn/tools/ 下载一份。

引言

Spring Boot 现已成为一项被广泛采用的技术,可以简化您在企业中实现 Spring 应用程序的工作。它特别适合创建基于微服务的应用程序,极大地改变了我们对小型、易于配置的 Spring 应用程序的看法。与 Spring Cloud 结合使用,它为真正的云原生应用程序打开了大门,这些应用程序可能由许多微服务组成。

这种架构思维上的巨大转变也需要在我们的 IDE 中有所体现。我们大多数传统的 Java IDE 不仅是在云原生时代之前发明的,而且在一定程度上是在编程的分布式时代之前。Spring Tool Suite 及其基础 Eclipse IDE 也是如此。现在是时候将这些 IDE 推向云原生时代了。这就是 Spring Boot Dashboard 的出发点。它的重点是帮助您处理数量可能更多的基于 Spring Boot 的微服务应用程序,并在您的 IDE 中处理这些项目时极大地简化您的开发工作。

Spring Boot Dashboard

Spring Boot Dashboard 最初是一个额外的视图,逐步集成到 STS/Eclipse 中。您可以通过单击主工具栏中的 Spring Boot 按钮来打开它。它会打开一个简单的视图,与您的工作区项目同步,显示工作区中的 Spring Boot 项目。

Boot Dashboard 的主要目的是让您快速访问日常、每小时甚至更频繁执行的操作。您可以在 Boot Dashboard 中选择您的 boot 应用程序,然后单击工具栏中的“运行”或“调试”操作,即可快速启动应用程序(以运行或调试模式)。没有比这更快启动 boot 应用程序的方法了。而且,由于您可能会更改代码并希望重新启动应用程序,如果应用程序已经在运行,该操作允许您重新启动它。修改您的代码,单击 Boot Dashboard 中的“运行”按钮,您的 boot 应用程序就会自动停止并重新启动。同样,这是一个简单的一键操作。

Boot Dashboard 中这些操作(以及更多其他操作)的强大之处在于它们可以同时作用于单个或多个项目。例如,如果您想同时启动或停止一组协同工作的 boot 应用程序,只需在 Dashboard 中全选它们,然后单击“运行”即可。就是这么简单。

一旦您在项目中采用 Spring Boot 1.3,您就会注意到 Boot Dashboard 中出现了更多额外的功能。当您的 boot 应用程序开始启动时,Boot Dashboard 会将其启动过程可视化呈现出来 - 并区分其启动阶段(虚拟机正在运行,但应用程序仍在初始化)和真正运行并准备就绪的状态。进度图标表示应用程序仍在启动中,绿色的“向上”图标则表示应用程序已完全初始化并运行。您无需一直盯着日志输出,等待诸如“服务器已启动”之类的消息出现。Boot Dashboard 的图标会告诉您应用程序的状态。

一旦应用程序运行起来,它监听的端口就会显示在 Boot Dashboard 中,方便您查看。您不必再扫描日志输出以查找应用程序正在使用的端口。Dashboard 会自动显示该信息。如果您想查看正在运行的 boot 应用程序的控制台输出,也有一个快速操作可以实现。

通常不再需要知道正在运行的应用程序的端口了,因为您不必自己为应用程序打开浏览器标签页。在 Boot Dashboard 中双击项目,它将为您打开一个新的浏览器标签页,直接导航到应用程序的默认 URL。

默认情况下,这会打开一个 Eclipse/STS 内部浏览器视图。如果您更喜欢使用外部浏览器,可以在首选项中进行设置。

如果此默认 URL 不是您希望默认访问的 URL,您可以对其进行自定义。打开属性视图,在 Boot Dashboard 中选择项目,然后输入您喜欢的默认 URL 扩展。双击将打开应用程序的默认 URL + 您自定义的扩展。

如果您不确定应用程序定义了哪些 URL 扩展,可以在属性视图中选择“请求映射 (Request Mappings)”选项卡。列表中列出了正在运行的应用程序的所有请求映射 - 您自己定义的位于顶部,来自库的位于列表底部。双击 URL 扩展将打开该扩展对应的浏览器页面,双击代码指针将在编辑器中打开您项目对应的文件,并跳转到定义该请求映射的那一行。

您的工作区中的微服务项目越多,您就越有可能不会同时处理所有项目。您可能希望只关注其中的一部分。例如,在 Eclipse/STS 中,您可能创建了一个工作集。Boot Dashboard 允许您为项目添加任意数量的标签(同样,在属性视图中)。然后,这些标签可以在过滤器框(位于 Boot Dashboard 的顶部)中使用,以减少 Boot Dashboard 中显示的项目数量。

展望

本系列的第二部分将介绍 Boot Dashboard 与 Cloud Foundry 的集成,如何从 Boot Dashboard 内部将微服务部署到 CF,以及如何将本地 boot 应用程序与部署在 CF 上的应用程序结合使用。

Spring XD 1.3 M1 发布

版本发布 | Mark Pollack | 2015 年 10 月 08 日 | ...

我代表 Spring XD 团队,非常高兴地宣布 Spring XD 1.3 的第一个里程碑版本发布

此版本包括错误修复和一些增强功能

  • Hadoop 分发版本更新至 Apache Hadoop 2.7.1 和 Hortonworks Data Platform 2.3。Pivotal Hadoop 2.1, 3.0 和 Cloudera Hadoop 5.4
  • 支持 Spark 1.3.1
  • Cassandra Sink
  • Header Enricher 处理器
  • Flo Designer UI 和 Admin UI 的错误修复
  • Gpfdist sink 现在支持更新操作和完整的控制文件选项范围
  • 更新到 Spring Integration 4.2,在启用监控时提供了性能改进。
  • 升级到 Spring Data Gosling Release Train

Spring 本周看点 - 2015 年 10 月 6 日

工程 | Josh Long | 2015 年 10 月 07 日 | ...

欢迎来到新一期的 Spring 本周看点!像往常一样,本周我们有很多内容要介绍,让我们开始吧!

Spring REST Docs 1.0.0.RELEASE

版本发布 | Andy Wilkinson | 2015 年 10 月 07 日 | ...

我很高兴地宣布 Spring REST Docs 1.0.0.RELEASE 版本已经发布。它可以从 Maven Central 和我们的版本发布仓库获取。

什么是 Spring REST Docs?

Spring REST Docs 帮助您文档化 RESTful 服务。它结合了使用 Asciidoctor 手写的文档和使用 Spring MVC Test 生成的自动片段。这种方法使您摆脱了 Swagger 等工具的限制。它帮助您生成准确、简洁、结构良好的文档。然后,这些文档可以让您的用户以最少的…获取所需信息。

Spring Initializr 的演进

工程 | Brian Clozel | 2015 年 10 月 06 日 | ...

今天我们很高兴地发布了新版本的 Spring Initializr,网址是 https://start.spring.io

最初只是一个生成 Spring Boot 项目的小型内部 Web 应用程序,如今已发展成为我们意想不到的更大规模的项目。您现在可以在 Web 上、在您喜爱的 IDE(Eclipse STS 和 IntelliJ IDEA)中,甚至使用命令行工具(尝试 curl https://start.spring.io)来使用 Spring Initializr。

同时,Spring 产品组合不断增长,我们也收到了来自 Spring 社区的许多有益反馈。由于没有什么比实际数据更可靠,我们在夏季之前改进了服务,将其指标导出到中央 redis 实例。这使得我们能够长期保存可靠的活动统计数据(并且无论我们在 Pivotal Web Services 上部署多少实例…)。

Spring Tool Suite 3.7.1 发布

版本发布 | Martin Lippert | 2015 年 10 月 06 日 | ...

亲爱的 Spring 社区朋友们,

我很高兴地宣布 Spring Tool Suite 3.7.1 版本发布,这是我们基于 Eclipse 的工具集。

此版本的亮点包括

  • 更新至 Eclipse Mars.1 (4.5.1),包括对 JDT 和 m2e 的多项修复
  • 更新至 Pivotal tc Server 3.1.2
  • Spring Boot YML 属性编辑器的各项改进
  • Spring Boot Starter 向导的改进
  • 全新支持 Spring Boot Devtools,包括能够将 Java 调试器附加到部署在 CF 上的应用程序。
  • 新的 Spring Boot Dashboard,目前处于测试阶段,但绝对是此版本的亮点

要下载分发版,请访问

详细的新特性和重要说明可以在这里找到:STS 3.7.1 新特性和重要说明

STS 3.7.2 计划于 2015 年 12 月发布。

祝您使用愉快!

关于 Java EE 7 采用情况的简要更新

新闻 | Juergen Hoeller | 2015 年 10 月 06 日 | ...

提醒:每当有人向您展示包含 Java EE 7 使用情况列的调查结果时,特别是在谈论生产环境中的使用时,请仔细核实他们实际调查的是什么。仅仅因为 Hibernate 4.3 是 JPA 2.1(EE 7 级别,但可以独立运行),其使用是否算作 Java EE 7?仅仅因为 Tomcat 8 是 Servlet 3.1,其使用是否算作 Java EE 7?当然,使用任何此类独立提供程序运行 Spring 应用程序是否算作 EE 7?

对这些统计数据要持保留态度:它们通常不询问“原生 Java EE 7 平台使用情况”,但最终呈现出来却是那样。为什么可以安全地假设他们没有调查生产环境中完整的 Java EE 7 平台使用情况?好吧,请记住我六月份的博客文章,它在 2015 年底仍然有效。与此同时,唯一真正的消息是自 IBM 在 WebSphere 的 Liberty Profile 中发布 EE 7 支持以来就没有其他新消息了。总而言之,此类调查的受访者…

Spring 本周看点 - 2015 年 9 月 29 日

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

欢迎来到新一期的 Spring 本周看点!对于正在美国阅读的各位,让我第一个祝您国家咖啡日快乐!像往常一样,我们有很多内容要介绍,让我们开始吧!

React.js 和 Spring Data REST:第 3 部分 - 条件操作

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

上一节中,您了解了如何开启 Spring Data REST 的超媒体控制,如何让 UI 按分页导航,以及如何根据页面大小的变化动态调整大小。您添加了创建和删除员工的功能,并让页面进行了相应的调整。但是,如果不考虑其他用户对您当前正在编辑的同一数据进行的更新,任何解决方案都不算完整。

欢迎从这个仓库获取代码并跟着操作。本节是在上一节应用程序的基础上添加了额外内容。

PUT 或不 PUT,这是个问题

当您获取资源时,存在一个风险:如果其他人更新了它,它可能会失效。为了解决这个问题,Spring Data REST 集成了两种技术:资源版本控制和 ETags。

通过在后端对资源进行版本控制并在前端使用 ETag,可以有条件地进行 PUT 更新。换句话说,您可以检测资源是否已更改,并防止 PUT(或 PATCH)操作覆盖其他人的更新。让我们来看看。

REST 资源版本控制

为了支持资源版本控制,为您需要此类保护的领域对象定义一个版本属性。

src/main/java/com/greglturnquist/payroll/Employee.java
@Data
@Entity
public class Employee {
private @Id @GeneratedValue Long id;
private String firstName;
private String lastName;
private String description;

private @Version @JsonIgnore Long version;

private Employee() {}

public Employee(String firstName, String lastName, String description) {
	this.firstName = firstName;
	this.lastName = lastName;
	this.description = description;
}

}

  • version 字段使用 javax.persistence.Version 进行注解。它会导致在每次插入和更新行时自动存储和更新一个值。

当获取单个资源(而不是集合资源)时,Spring Data REST 将自动添加一个 ETag 响应头,其值就是此字段的值。

获取单个资源及其头部信息

上一节中,您使用了集合资源来收集数据并填充 UI 的 HTML 表格。对于 Spring Data REST,_embedded 数据集被视为数据的预览。虽然对于快速浏览数据很有用,但要获取诸如 ETag 之类的头部信息,您需要单独获取每个资源。

在此版本中,loadFromServer 已更新为先获取集合,然后使用 URI 检索每个单个资源。

src/main/resources/static/app.jsx - 获取每个资源
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;
            this.links = employeeCollection.entity._links;
            return employeeCollection;
        });
    }).then(employeeCollection => {
        return employeeCollection.entity._embedded.employees.map(employee =>
                client({
                    method: 'GET',
                    path: employee._links.self.href
                })
        );
    }).then(employeePromises => {
        return when.all(employeePromises);
    }).done(employees => {
        this.setState({
            employees: employees,
            attributes: Object.keys(this.schema.properties),
            pageSize: pageSize,
            links: this.links
        });
    });
},
  1. follow() 函数访问 employees 集合资源。
  2. then(employeeCollection ⇒ …​) 子句创建一个调用以获取 JSON Schema 数据。这有一个子 then 子句,用于将元数据和导航链接存储在 <App/> 组件中。
    • 请注意,这个嵌入的 promise 返回了 employeeCollection。这样,集合可以传递给下一个调用,同时允许您在过程中获取元数据。
  3. 第二个 then(employeeCollection ⇒ …​) 子句将员工集合转换为一个 GET promises 数组,用于获取每个单个资源。这就是获取每个员工 ETag 头部信息所需的操作。
  4. then(employeePromises ⇒ …​) 子句接收 GET promises 数组,并使用 when.all() 将它们合并为一个 promise,当所有 GET promises 都被解析时,该 promise 也将被解析。
  5. loadFromServer 最后以 done(employees ⇒ …​) 结束,在此通过数据的这种整合来更新 UI 状态。

这个链式调用也在其他地方实现。例如,用于跳转到不同页面的 onNavigate() 函数已更新为获取单个资源。由于它与上面展示的流程大部分相同,本节中并未详细介绍。

更新现有资源

在本节中,您将添加一个 UpdateDialog React 组件来编辑现有的员工记录。

src/main/resources/static/app.jsx - UpdateDialog 组件
var UpdateDialog = React.createClass({
handleSubmit: function (e) {
    e.preventDefault();
    var updatedEmployee = {};
    this.props.attributes.forEach(attribute =&gt; {
        updatedEmployee[attribute] = React.findDOMNode(this.refs[attribute]).value.trim…

获取 Spring 邮件列表

订阅 Spring 邮件列表,保持联系

订阅

快人一步

VMware 提供培训和认证,助您快速提升。

了解更多

获取支持

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

了解更多

即将到来的活动

查看 Spring 社区所有即将到来的活动。

查看全部