查阅新指南:"使用 Vaadin 创建 CRUD UI"

工程 | Greg L. Turnquist | 2015 年 9 月 28 日 | ...

Spring 社区,大家好,

今天我们发布了一个新指南:使用 Vaadin 创建 CRUD UI

本指南由 Vaadin 团队编写,展示了如何精美地构建一个利用 Spring Data 的 UI,而无需编写任何 JavaScript 或 HTML 代码。

Vaadin 非常酷

  • 自带 Spring Boot 启动器
  • 与构造函数注入完美配合
  • 使其易于集成 Spring Data 等持久化解决方案
  • 配备了丰富的插件,可发展成为真正的应用程序

查阅这份新出炉的指南,尽情享受吧!

作为 SpringOne 2GX 的后续,我们确定了一些需要编写的更多指南。云原生正席卷开发社区,人们寻求更多解决方案。我们的工作不应该是安装堆叠服务器或构建基础设施。相反,我们应该专注于流畅便捷的解决方案。编写云原生…应用程序。

本周 Spring 要闻 - 2015 年 9 月 22 日

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

欢迎阅读新一期《本周 Spring 要闻》!本周,刚刚结束了精彩绝伦的 SpringOne2GX 2015,老实说,我有点精疲力尽了!:D 但 Spring 依然坚挺,本周我与好友 Martin Deinum 一起在阿姆斯特丹,帮助一大批开发者通过 Spring Boot、Spring Cloud 和 Cloud Foundry 开启云原生之旅。

Spring Integration 的 Java DSL 1.1 GA 版现已发布

工程 | Artem Bilan | 2015 年 9 月 22 日 | ...

亲爱的 Spring 社区!

我代表 Spring Integration 团队高兴地宣布,Spring Integration Java DSL 的 1.1 GA 版本现已在Release RepositoryMaven Central发布。

对于 Gradle,请使用此依赖

'org.springframework.integration:spring-integration-java-dsl:1.1.0.RELEASE'

对于 Maven,请使用此依赖

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

首先非常感谢上周在 SpringOne 2GX 2015 大会上前来听我演讲的所有人……

Spring for Apache Hadoop 2.3 里程碑 3 发布

发布 | Thomas Risberg | 2015 年 9 月 22 日 | ...

我们很高兴地宣布 Spring for Apache Hadoop 2.3 M3 里程碑版本发布。

此版本中最重要的增强功能

  • 更新构建以使用 Spring Framework 4.2.1, Boot 1.3.0.M5, Batch 3.0.5 [SHDP-509]
  • 将注解配置移至单独的子项目以减少 spring-data-hadoop-boot 的依赖 [SHDP-525]
  • 为 Spark Tasklet 添加额外属性 [SHDP-397]
  • 升级构建以使用 Spark 1.5.0 [SHDP-521]

详情请参阅版本更新日志

我们将继续在 Spring IO 里程碑仓库中提供带有各自传递依赖的特定版本构件

  • 2.3.0.M3 (默认 - Apache Hadoop stable 2.7.1)
  • 2.3.0.M3-hadoop26 (Apache Hadoop 2.6.0)
  • 2.3.0.M3-phd30 (Pivotal HD 3.0)
  • 2.3.0.M3-phd21 (Pivotal HD 2.1)
  • 2.3.0.M3-cdh5 (Cloudera CDH 5.4)
  • 2.3.0.M3-hdp23 (Hortonworks HDP 2.3)

使用 Vaadin Spring 1.0 构建单页 Web 应用

工程 | Stéphane Nicoll | 2015 年 9 月 17 日 | ...

这篇博文是社区成员 Matti Tahvonen (@MattiTahvonen) 的客座文章,他是一名开发者倡导者,供职于 Vaadin Ltd,该公司是 Vaadin Framework 的原始开发者,并为其提供商业服务和扩展。

Vaadin 的 Spring 集成库自五月以来一直处于 Beta 阶段,已被多个生产应用使用。今天我们很自豪地宣布,Beta 标志已移除,稳定的 1.0.0 版本已经发布。

Vaadin 是一个基于组件的 Web UI 框架,您的应用程序状态和逻辑都存储在 Java 内存中……

Spring Cloud Brixton 版本列车的首个里程碑现已发布

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

我代表 Spring Cloud 团队,很高兴宣布Spring Cloud Brixton 版本列车的首个里程碑。该里程碑版本现已发布,可在我们的Spring 里程碑仓库中找到。我们进行了许多增强和 bug 修复,部分亮点包括

  • 支持 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、阿里巴巴和 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" : "http://localhost:8080/api/employees?page=0&size=2"
    },
    "self" : {
      "href" : "http://localhost:8080/api/employees"
    },
    "next" : {
      "href" : "http://localhost:8080/api/employees?page=1&size=2"
    },
    "last" : {
      "href" : "http://localhost:8080/api/employees?page=2&size=2"
    }
  },
  "_embedded" : {
    "employees" : [ {
      "firstName" : "Frodo",
      "lastName" : "Baggins",
      "description" : "ring bearer",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/api/employees/1"
        }
      }
    }, {
      "firstName" : "Bilbo",
      "lastName" : "Baggins",
      "description" : "burglar",
      "_links" : {
        "self" : {
          "href" : "http://localhost:8080/api/employees/2"
        }
      }
    } ]
  },
  "page" : {
    "size" : 2,
    "totalElements" : 6,
    "totalPages" : 3,
    "number" : 0
  }
}

默认页面大小是 20,要查看实际效果,可以应用 ?size=2。正如预期,只列出了两名员工。此外,还有 firstnextlast 链接。还有一个 self 链接,不包含上下文,包括页面参数。

如果您导航到 next 链接,您还会看到一个 prev 链接

$ curl "http://localhost:8080/api/employees?page=1&size=2"
{
  "_links" : {
    "first" : {
      "href" : "http://localhost:8080/api/employees?page=0&size=2"
    },
    "prev" : {
      "href" : "http://localhost:8080/api/employees?page=0&size=2"
    },
    "self" : {
      "href" : "http://localhost:8080/api/employees"
    },
    "next" : {
      "href" : "http://localhost:8080/api/employees?page=2&size=2"
    },
    "last" : {
      "href" : "http://localhost: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=<pageSize>。还有其他可以提供的选项,您将在后面看到。

获取 JSON Schema 元数据

通过基于 size 的查询导航到 employees 后,employeeCollection 触手可及。在上一期中,我们就此打住,并在 <EmployeeList /> 中显示了数据。今天,您将执行另一个调用,以获取位于 /api/profile/employees 的一些JSON Schema 元数据

您可以自己查看数据

$ curl http://localhost: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 新闻通讯

订阅 Spring 新闻通讯,保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速发展。

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部