备受期待的Java Enterprise Edition 8版本拥有两个激动人心的新API(JSON绑定1.0和Java EE Security 1.0)以及对当前API的改进(JAX-RS 2.1,Bean Validation 2.0,JSF 2.3,CDI 2.0,JSON-P) 1.1,JPA 2.2和Servlet 4.0)。 这是近四年来Oracle企业Java平台的第一个版本,它包含数百个新功能,更新的功能和错误修复。 那么最好的新功能是什么? 我试图在这篇博客文章中回答这个高度主观的问题。
TL; DR的前5个新功能
- 新的安全性API:注释驱动的身份验证机制
全新的安全性API包含三个出色的新功能:标识存储抽象,新的安全性上下文以及新的注释驱动的身份验证机制,使web.xml文件声明过时。 这就是我今天要谈论的最后一个。 - JAX-RS 2.1:新的反应式客户端
JAX-RS 2.1中新的反应式客户端包含反应式编程风格,并允许端点结果的组合。 - 新的JSON绑定API
新的JSON绑定API为JSON序列化和反序列化提供了本机Java EE解决方案。 - CDI 2.0:在Java SE中使用
CDI 2.0中有趣的新功能允许在Java SE应用程序中引导CDI。 - Servlet 4.0:服务器推送
Servlet 4.0中的服务器推送功能使Servlet规范与HTTP / 2保持一致。
你准备好了吗? 因此,让我们开始吧。
1.新的安全性API
可能,添加到Java EE 8中最重要的一项新功能就是新的安全性API。
此新API的主要动机是简化,标准化和现代化跨容器和实现处理安全性问题的方式。 他们做得很好。
由于三个新的注释使web.xml文件声明变得多余,Web身份验证的配置已实现现代化。 稍后再详细介绍。
新的安全上下文 API标准化了Servlet和EJB容器执行身份验证以及
新的身份存储库抽象可简化身份存储库的使用。
因此,让我们看一下其中的第一个。
注释驱动的认证机制
此功能全部与配置Web安全有关。 web.xml文件中需要哪种传统的XML声明。
有了HttpAuthenticationMechanism接口,该接口代表HTTP身份验证,并带有三个内置的启用CDI的实现,每个实现都可以表示可配置Web安全的三种方式之一,因此不再需要此操作。
使用这些注释之一触发它们。
@BasicAuthenticationMechanismDefinition
@FormAuthenticationMechanismDefinition
@CustomFormAuthenticationMechanismDefinition
它们复制了servlet容器中已经可用的经典HTTP基本身份验证,表单和基于自定义表单的身份验证的功能。
例如,要启用基本身份验证, 仅需向您的servlet添加BasicAuthenticationMechanismDefinition批注即可。
@BasicAuthenticationMechanismDefinition(realmName="${'user-realm'}")
@WebServlet("/user")
@DeclareRoles({ "admin", "user", "demo" })
@ServletSecurity(@HttpConstraint(rolesAllowed = "user"))
public class UserServlet extends HttpServlet { … }
现在,您可以放弃XML配置,并使用这些新注释之一来提高Web安全性。
2. JAX-RS 2.1:新的反应式客户端
让我们看一下JAX-RS 2.1中新的反应式客户端,以及它如何包含反应式编程风格。
被动式方法以数据流的思想为中心,该模型具有一个执行模型,该模型可以在流中传播更改。 一个典型的示例是JAX-RS方法调用。 当调用返回时,对方法调用的结果执行下一个操作(可能是继续,完成或错误)。
您可以将其视为流程的异步管道 ,而下一个流程将对前一个流程的结果起作用,然后将其流程的结果传递给链中的下一个流程。 数据流是可组合的,因此您可以将许多流组合并转换为一个结果。
通过在用于构造客户端实例的Invocation.Builder实例上调用rx()方法来启用反应式功能。 它的返回类型是带有参数化响应类型的CompletionStage 。 Java 8中引入了CompletionStage接口,并提出了一些有趣的可能性。
例如,在此代码段中,对不同的端点进行了两次调用,然后将结果合并:
CompletionStage<Response> cs1 = ClientBuilder.newClient().target(".../books/history").request().rx().get();CompletionStage<Response> cs2 = ClientBuilder.newClient().target(".../books/geology").request().rx().get();cs1.thenCombine(cs2, (r1, r2) ->r1.readEntity(String.class) + r2.readEntity(String.class)).thenAccept(System.out::println);
3.新的JSON绑定API
现在,让我们继续下一个重要功能。 新的JSON绑定API,此API为JSON序列化和反序列化提供了本机Java EE解决方案 。
以前,如果要在JSON上对Java进行序列化和反序列化,则必须依靠Jackson或GSON之类的第三方API。 不再。 使用新的JSON Binding API,您可以拥有所有可能希望本机可用的功能。
从Java对象生成JSON文档再简单不过了。 只需调用toJson()方法并将其要序列化的实例传递给它即可。
String bookJson = JsonbBuilder.create().toJson(book);
将JSON文档反序列化为Java对象也很简单。 只需将JSON文档和目标类传递给fromJson()方法,然后弹出您的Java对象。
Book book = JsonbBuilder.create().fromJson(bookJson, Book.class);
但这还不是全部。
行为定制
通过注释字段,JavaBeans方法和类,可以自定义默认的序列化和反序列化行为。
例如,您可以使用@JsonbNillable定制空处理,并使用@JsonbPropertyOrder注释定制在类级别指定的属性顺序。 你可以指定与@JsonbNumberFormat()标注的数字格式,并与@JsonbProperty()注释更改字段的名称。
@JsonbNillable
@JsonbPropertyOrder(PropertyOrderStrategy.REVERSE)
public class Booklet {@JsonbProperty("cost")@JsonbNumberFormat("#0.00")private Float price;}
或者,您可以选择使用运行时配置构建器JsonbConfig来处理定制:
JsonbConfig jsonbConfig = new JsonbConfig().withPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CASE_WITH_DASHES).withNullValues(true).withFormatting(true);Jsonb jsonb = JsonbBuilder.create(jsonbConfig);
无论哪种方式,JSON Binding API都为Java对象的序列化和反序列化提供了广泛的功能。
4. CDI 2.0:在Java SE中使用
现在,让我们继续下一个API。 CDI 2.0 API。 此版本具有许多新功能,更有趣的功能之一是能够在Java SE应用程序中引导CDI 。
要在Java SE中使用CDI,必须明确引导CDI容器。 这可以通过在SeContainerInitializer抽象类上调用静态方法 newInstance() 来实现 。 它返回一个SeContainer实例,该实例是CDI运行时的句柄,您可以使用该实例执行CDI解析,如此代码段所示。 它可以访问BeanManager,它是CDI的核心入口点。
SeContainer seContainer =SeContainerInitializer.newInstance().initialize();Greeting greeting = seContainer.select(Greeting.class).get();greeting.printMessage("Hello World");seContainer.close();
通过向CDI bean传递要检索和使用的bean的类名,可以使用select()方法对其进行检索。
配置选项
通过添加拦截器,扩展,替代品,属性和装饰器,可以对SeContext进行进一步的配置 。
.enableInterceptors()
.addExtensions()
.selectAlternatives()
.setProperties()
.enableDecorators()
通过调用SeContainer上的close()方法来手动关闭容器,或者在使用try-with-resources结构时自动关闭容器,因为SeContainer扩展了AutoCloseable接口。
5. Servlet 4.0:服务器推送
最后但并非最不重要的一点是,Servlet 4.0中的服务器推送功能使Servlet规范与HTTP / 2保持一致。
要了解此功能,您首先需要知道什么是服务器推送。
什么是服务器推送?
服务器推送是HTTP / 2协议中的许多新功能之一,旨在通过将客户端资源推送到浏览器的缓存中来预期客户端资源需求,以便客户端发送网页请求并收到响应时返回从服务器上,它所需的资源已经在缓存中。 这是一项性能增强功能,可提高网页加载速度。
它在Servlet 4.0中如何公开?
在Servlet 4.0中, 服务器Push功能通过从HttpServletRequest实例获得的PushBuilder实例公开 。
看一下这个代码片段。 您可以看到header.png的路径是通过path()方法在PushBuilder实例上设置的,并通过调用push()将其推送到客户端。 当该方法返回时,将清除路径和条件标头,以供构建器重用。 推送menu.css文件,然后将ajax.js javascript文件推送到客户端。
protected void doGet(HttpServletRequest request, HttpServletResponse response) {PushBuilder pushBuilder = request.newPushBuilder();pushBuilder.path("images/header.png").push();pushBuilder.path("css/menu.css").push();pushBuilder.path("js/ajax.js").push();// Return JSP that requires these resources}
到Servlet doGet()方法完成执行时,资源将到达浏览器。 从JSP生成HTML需要这些资源,由于它们已经是浏览器缓存,因此不需要从服务器请求它们。
结论
好吧,这是Java EE 8中最好的新功能,但是还有许多其他功能可以告诉您。
目前为止就这样了。
翻译自: https://www.javacodegeeks.com/2018/04/the-top-5-new-features-in-java-ee-8.html