万众期待的 Java?EE 8 即将发布。这是自 2013 年 6 月以来 Java 企业平台的首次发布,是分成两部分的发布中的前半部分(后一部分是 Java EE 9)。Oracle 对 Java EE 进行了战略性重新定位,重点关注一些支持云计算、微服务和反应式编程的技术。反应式编程现在正融入到许多 Java EE API 的架构中,而 JSON 交换格式为核心平台提供了支撑。
我们将大体了解 Java EE 8 中提供的主要特性。重点包括 API 更新和引入、对 HTTP/2 的新支持、反应式编程,以及 JSON。我们首先会介绍 Java EE 规范和升级,它们无疑将决定企业 Java 编程未来几年的发展方向。
全新的 API 和更新的 API
Java EE 8 向核心 API 引入了一些主要和次要更新,比如 Servlet 4.0 和 Context and Dependency Injection 2.0。还引入了两个新的 API —Java API for JSON Binding (JSR 367) 和 Java EE Security API (JSR 375)。我们首先介绍新的 API,然后探索对存在已久的 Java EE 规范的改动。
JSON Binding API
新的 JSON Binding API (JSON-B) 支持在 Java 对象与兼容 RFC 7159 的 JSON 之间执行序列化和反序列化,同时维护与 JAXB (Java API for XML Binding 2.0) 的一致性。它提供了从 Java 类和实例到符合公认约定的 JSON 文档的默认映射。
JSON-B xu 还允许开发人员自定义序列化和反序列化。您可以使用注释自定义各个类的这些流程,或者使用运行时配置构建器来开发自定义策略。后一种方法包括使用适配器来支持用户定义的自定义。JSON-B 与 Java API for JSON Processing (JSON-P) 1.1(本文后面将讨论)紧密集成。
规范内容
两个接口为新的 JSON Binding API 提供了入口:JsonbBinding 和 Jsonb。
- JsonbBinding 提供了 JSON Binding API 的客户端访问点。为此,它通过根据所设置的配置和参数来构建 Jsonb 实例。
- Jsonb 通过方法 toJson() 和 fromJson() 提供序列化和反序列化操作。
JSON-B 还可以向插入的外部 JSON Binding 提供者描述功能,所以您不受 API 附带的绑定逻辑的限制。
使用 JsonB 实现序列化和反序列化
清单 1 首先序列化 Book 类 book 的实例,然后将其反序列化。
清单 1. 序列化和反序列化的最简单示例
String bookJson = JsonbBuilder.create().toJson(book); Book book = JsonbBuilder.create().fromJson(bookJson, Book.class);
静态 create() 工厂方法返回一个 Jsonb 实例。您可以在该实例上调用许多重载的 toJson() 和 fromJson() 方法。另请注意,该规范没有强制要求来回等效转换:在上面的示例中,将 bookJson 字符串传入 fromJson() 方法中可能不会反序列化为一个等效对象。
JSON-B 还支持采用与对象大致相同的方式来绑定集合类与原语和/或实例数组 —包括多维数组。
自定义 Jsonb
可通过为字段、JavaBeans 方法和类添加注释,对 Jsonb 方法的默认行为进行自定义。
例如,可以使用 @JsonbNillable 和 @JsonbPropertyOrder 注释来自定义 null 处理和属性顺序,该顺序应在类级别上进行自定义:
清单 2. 自定义 Jsonb
@JsonbNillable @JsonbPropertyOrder(PropertyOrderStrategy.REVERSE) public class Booklet { private String title; @JsonbProperty("cost") @JsonbNumberFormat("#0.00") private Float price; private Author author; @JsonbTransient public String getTitle() { return title; } @JsonbTransient public void setTitle(String title) { this.title = title; } // price and author getters/setter removed for brevity }
调用方法 toJson() 会生成清单 3 中所示的 JSON 结构。
清单 3. 自定义的 JSON 结构
{ "cost": "10.00", "author": { "firstName": "Alex", "lastName": "Theedom" } }
也可以选择通过运行时配置构建器 JsonbConfig 来执行自定义:
清单 4. Jsonb 的运行时配置
JsonbConfig jsonbConfig = new JsonbConfig() .withPropertyNamingStrategy( PropertyNamingStrategy.LOWER_CASE_WITH_DASHES) .withNullValues(true) .withFormatting(true); Jsonb jsonb = JsonbBuilder.create(jsonbConfig);
清单 4 将 JSON-B 配置为使用 LOWER_CASE_WITH_DASHES 约定,以便将 null 保留在它们所在的位置,并输出经过优化的 JSON。
开源绑定
前面已经提到过,您不需要使用现成的 JSON-B 选项。清单 5 展示了如何配置开源绑定实现:
清单 5. 开源绑定配置
JsonbBuilder builder = JsonbBuilder.newBuilder("aProvider");
Java EE Security API
新 Java EE Security API 的引入,是为了更正各种 servlet 容器在解决安全问题的方式上的不一致。这个问题在 Java Web 配置文件中尤为突出,主要是因为 Java EE 仅规定了完整的 Java EE 配置文件必须如何实现标准 API。新规范还引入了一些现有 API 没有利用的现代功能,比如 CDI。
这个 API 的美妙之处在于,它提供了一种配置身份存储和身份验证机制的备选方法,但没有取代现有安全机制。开发人员应该非常希望拥有在 Java EE Web 应用程序中启用安全性的机会,无论是否使用特定于供应商的解决方案或专用的解决方案。
规范内容
Java EE Security API 规范解决了 3 个关键问题:
- HttpAuthenticationMechanism 支持对 servlet 容器执行身份验证。
- IdentityStore 标准化了 JAAS LoginModule。
- SecurityContext 提供了一个实现编