Apache CXF 3.0:CDI 1.1支持替代Spring

几周前刚刚发布了Apache CXF 3.0 ,该项目又迈出了满足JAX-RS 2.0规范要求的又一个重要步骤:与CDI 1.1集成。 在此博客文章中,我们将看几个有关Apache CXF 3.0和Apache CXF 3.0如何协同工作的示例。

3.0版开始, Apache CXF包含一个名为cxf-integration-cdi的新模块,可以轻松将其添加到您的Apache Maven POM文件中:

<dependency><groupId>org.apache.cxf</groupId><artifactId>cxf-integration-cdi</artifactId><version>3.0.0</version>
</dependency>

这个新模块仅包含两个组件(实际上,其中包含一些组件,但它们是关键组件):

  • CXFCdiServlet :用于引导Apache CXF应用程序的servlet,其作用与CXFServletCXFNonSpringJaxrsServlet相同,…
  • JAXRSCdiResourceExtension :可移植的CDI 1.1扩展,发生了所有魔术

在启用CDI 1.1的环境中运行时,便携式扩展由CDI 1.1容器发现,并使用生命周期事件进行初始化。 这实际上就是您所需要的! 让我们看一下实际的应用程序。

我们将构建一个非常简单的JAX-RS 2.0应用程序,以使用Apache CXF 3.0和CDI 1.1参考实现JBoss Weld 2.1来管理人员。 我们将用于人物表示的Person类只是一个简单的Java bean:

package com.example.model;public class Person {private String email;private String firstName;private String lastName;public Person() {}public Person( final String email, final String firstName, final String lastName ) {this.email = email;this.firstName = firstName;this.lastName = lastName;}// Getters and setters are ommited// ... 
}

现在非常普遍,我们将在嵌入式Jetty 9.1容器中运行应用程序,而Starter类正是这样做的:

package com.example;import org.apache.cxf.cdi.CXFCdiServlet;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.jboss.weld.environment.servlet.BeanManagerResourceBindingListener;
import org.jboss.weld.environment.servlet.Listener;public class Starter { public static void main( final String[] args ) throws Exception {final Server server = new Server( 8080 );// Register and map the dispatcher servletfinal ServletHolder servletHolder = new ServletHolder( new CXFCdiServlet() );final ServletContextHandler context = new ServletContextHandler();   context.setContextPath( "/" );    context.addEventListener( new Listener() );   context.addEventListener( new BeanManagerResourceBindingListener() );context.addServlet( servletHolder, "/rest/*" );server.setHandler( context );server.start();        server.join(); }
}

请注意,存在CXFCdiServlet和两个强制侦听器,它们已添加到上下文中:

  • org.jboss.weld.environment.servlet.Listener负责CDI注入
  • org.jboss.weld.environment.servlet.BeanManagerResourceBindingListener将对BeanManager的引用绑定到JNDI位置java:comp / env / BeanManager ,以使其可以从应用程序的任何位置访问

这样,您就可以使用CDI 1.1的全部功能。 让我们介绍使用@Named注释注释的PeopleService类,以及使用@PostConstruct声明和注释的初始化方法来创建一个人的方法。

@Named
public class PeopleService {private final ConcurrentMap< String, Person > persons = new ConcurrentHashMap< String, Person >(); @PostConstructpublic void init() {  persons.put( "a@b.com", new Person( "a@b.com", "Tom", "Bombadilt" ) );}// Additional methods // ...
}

到目前为止,我们还没有谈到在CDI 1.1环境中配置JAX-RS 2.0应用程序和资源。 原因很简单:根据应用程序的不同,您可以采用零努力配置或完全可定制的配置。 让我们经历两种方法。

使用零努力配置,您可以定义一个空的JAX-RS 2.0应用程序和任意数量的JAX-RS 2.0资源: Apache CXF 3.0隐式地通过将每个资源类与该应用程序相关联来将它们连接在一起。 这是JAX-RS 2.0应用程序的示例:

package com.example.rs;import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;@ApplicationPath( "api" )
public class JaxRsApiApplication extends Application {
}

这里是一个JAX-RS 2.0资源PeopleRestService中注入了PeopleService托管bean:

package com.example.rs;import java.util.Collection;import javax.inject.Inject;
import javax.ws.rs.DELETE;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;import com.example.model.Person;
import com.example.services.PeopleService;@Path( "/people" )
public class PeopleRestService {@Inject private PeopleService peopleService;@Produces( { MediaType.APPLICATION_JSON } )@GETpublic Collection< Person > getPeople( @QueryParam( "page") @DefaultValue( "1" ) final int page ) {// ...}@Produces( { MediaType.APPLICATION_JSON } )@Path( "/{email}" )@GETpublic Person getPerson( @PathParam( "email" ) final String email ) {// ...}@Produces( { MediaType.APPLICATION_JSON  } )@POSTpublic Response addPerson( @Context final UriInfo uriInfo,@FormParam( "email" ) final String email, @FormParam( "firstName" ) final String firstName, @FormParam( "lastName" ) final String lastName ) {// ...}// More HTTP methods here // ...
}

不需要任何其他操作: Apache CXF 3.0应用程序可以像这样运行并具有完整的功能。 GitHub上提供了示例项目的完整源代码。 请记住,如果遵循此样式,则仅应声明一个空的JAX-RS 2.0应用程序。

通过可定制的方法,可以使用更多选项,但是还需要做更多的工作。 每个JAX-RS 2.0应用程序都应提供非空的getClasses()或/和getSingletons()集合实现。 但是,JAX-RS 2.0资源类保持不变。 这是一个示例(基本上导致了我们之前所见的相同应用程序配置):

package com.example.rs;import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;import javax.enterprise.inject.Produces;
import javax.inject.Inject;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;@ApplicationPath( "api" )
public class JaxRsApiApplication extends Application {@Inject private PeopleRestService peopleRestService;@Produces private JacksonJsonProvider jacksonJsonProvider = new JacksonJsonProvider();  @Overridepublic Set< Object > getSingletons() {return new HashSet<>(Arrays.asList( peopleRestService, jacksonJsonProvider ));}
}

请注意, JAXRSCdiResourceExtension便携式CDI 1.1扩展会自动为每个JAX-RS 2.0应用程序(扩展Application的应用程序 )和资源(以@Path注释)创建托管bean。 这样,它们立即可用于注入(例如,上面的代码段中的PeopleRestService )。 类JacksonJsonProvider@Provider注释进行注释,因此将被视为JAX-RS 2.0提供程序。 以这种方式定义的JAX-RS 2.0应用程序没有限制。 使用该方法的示例项目的完整源代码可在GitHub上获得 。

无论您选择哪种方法,我们的示例应用程序都可以正常工作。 让我们构建它并运行:

> mvn clean package
> java -jar target/jax-rs-2.0-cdi-0.0.1-SNAPSHOT.jar

调用已实现的REST API对可确认应用程序正常运行和配置。 让我们发出GET命令,以确保在创建托管bean时调用了@PostConstruct注释的PeopleService方法。

> curl http://localhost:8080/rest/api/peopleHTTP/1.1 200 OK
Content-Type: application/json
Date: Thu, 29 May 2014 22:39:35 GMT
Transfer-Encoding: chunked
Server: Jetty(9.1.z-SNAPSHOT)[{"email":"a@b.com","firstName":"Tom","lastName":"Bombadilt"}]

这是POST命令的示例:

> curl -i http://localhost:8080/rest/api/people -X POST -d "email=a@c.com&firstName=Tom&lastName=Knocker"HTTP/1.1 201 Created
Content-Type: application/json
Date: Thu, 29 May 2014 22:40:08 GMT
Location: http://localhost:8080/rest/api/people/a@c.com
Transfer-Encoding: chunked
Server: Jetty(9.1.z-SNAPSHOT){"email":"a@c.com","firstName":"Tom","lastName":"Knocker"}

在此博客文章中,我们只是简单介绍了Apache CXF和CDI 1.1集成现在可以实现的功能。 只需提及,在大多数JEE应用程序服务器和Servlet容器上都可以进行嵌入式Apache Tomcat 7.x / 8.x以及基于WAR的带有CDI 1.1的Apache CXF部署。

请查看官方文档并尝试一下!

  • 完整的源代码可在GitHub上找到 。

翻译自: https://www.javacodegeeks.com/2014/06/apache-cxf-3-0-cdi-1-1-support-as-alternative-to-spring.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java varbinary_SQL 中存放 varbinary型数据

使用带有 BULK 选项的 OPENROWSET以下 Transact-SQL 增强功能支持 OPENROWSET(BULK...)函数&#xff1a;与 SELECT 一起使用的 FROM 子句可以调用 OPENROWSET(BULK...)而非表名&#xff0c;同时可以实现完整的 SELECT 功能。带有 BULK 选项的 OPENROWSET 在 FROM 子句中需要有一…

python矩阵左除_matlab学习笔记

Matlab学习笔记运算&#xff1a;1. 算术运算(在矩阵意义下进行):要求矩阵同型,对应元素相加减&#xff0c;如果用标量和矩阵相加减&#xff0c;不同型就凉凉提示错误&#xff0c;那就将矩阵每个元素和数字相加减-&#xff1a;同上*&#xff1a;A*B要求左行右列&#xff0c;…

只读副本和Spring Data第1部分:配置数据库

这是有关我们为利用只读副本来提高应用程序性能而寻求的一系列博客文章。 对于这个项目&#xff0c;我们的目标是建立我们的spring数据应用程序&#xff0c;并使用read仓库进行写操作&#xff0c;并基于read副本进行读操作。 为了模拟这种环境&#xff0c;我们将通过Docker使…

java结构体系_java io结构体系

Java IO体系结构看似庞大复杂,其实有规律可循,要弄清楚其结构,需要明白两点:1. 其对称性质:InputStream 与 OutputStream, Reader 与 Writer,他们分别是一套字节输入-输出,字符输入-输出体系2. 原始处理器(适配器)与链接流处理器(装饰器)其结构图如下:Reader-Writer体系1. 基类…

python turtle应用实例_turtle库应用实例2-六芒星的绘制

‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬描述使用turtle库绘制一个六角形&#xff0c;效果如下&#xff1a;‪…

java按钮改变窗口大小_布局似乎有问题,JButton在调整窗口大小时显示出意外的行为。...

很好的例子的问题可能与平台有关&#xff0c;但我可以提供一些观察&#xff1a;您没有添加或删除组件&#xff0c;所以您不需要revalidate().由于背景色是按钮的绑定属性&#xff0c;因此不需要后续调用repaint().你&#xff0c;你们做需要repaint()在你的习惯里DrawingArea&am…

JUnit 5和Selenium –使用Selenium内置的`PageFactory`实现页面对象模式

Selenium是一组支持浏览器自动化的工具和库&#xff0c;主要用于Web应用程序测试。 Selenium的组件之一是Selenium WebDriver&#xff0c;它提供客户端库&#xff0c;JSON有线协议&#xff08;与浏览器驱动程序进行通信的协议&#xff09;和浏览器驱动程序。 Selenium WebDrive…

python 配置文件中密码不能是明文_配置文件中明文密码改为密文密码的方法

我们用java链接数据库&#xff0c;不管是web项目还是小程序&#xff0c;都需要把数据库密码写在配置文件中(当然你要写死在程序里也没有办法)&#xff0c;或者数据库中&#xff0c;通常源代码漏洞扫描都会告诉你不能有明文密码&#xff0c;那么有什么办法可以变为密文呢&#x…

java.lang 源码剖析_java.lang.Void类源码解析

在一次源码查看ThreadGroup的时候&#xff0c;看到一段代码&#xff0c;为以下&#xff1a;/** throws NullPointerException if the parent argument is {code null}* throws SecurityException if the current thread cannot create a* thread in the specified thread group…

vant按需引入没样式_vue vant-ui样式出不来的问题

第一步&#xff1a;安装vantnpm i vant -S // 或 yarn add vant第二步&#xff1a;配置按需引入// 在 babel.config.js 中配置 module.exports {plugins: [[import, {libraryName: vant,libraryDirectory: es,style: true}, vant]] };第三步&#xff1a;配置vue.config.js&…

javaserver_如何在JavaServer Pages中使用Salesforce REST API

javaserver摘要&#xff1a;本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com &#xff08;同时使用HTTP&#xff08;S&#xff09;和JSON&#xff09;管理数据的分步过程。 在此示例中&#xff0c;我将Mac OS X…

jmeter线程数并发数区别_如何确定Kafka的分区数、key和consumer线程数、以及不消费问题解决...

在Kafak中国社区的qq群中&#xff0c;这个问题被提及的比例是相当高的&#xff0c;这也是Kafka用户最常碰到的问题之一。本文结合Kafka源码试图对该问题相关的因素进行探讨。希望对大家有所帮助。怎么确定分区数&#xff1f;“我应该选择几个分区&#xff1f;”——如果你在Kaf…

简述java规范要注意哪些问题_JAVA学习:JAVA基础面试题(经典)

第一阶段题库基础知识部分&#xff1a;1. JDK是什么&#xff1f;JRE是什么&#xff1f;a) 答&#xff1a;JDK&#xff1a;java开发工具包。JRE&#xff1a;java运行时环境。2. 什么是java的平台无关性&#xff1f;a) 答&#xff1a;Java源文件被编译成字节码的形式&#xff0c;…

我可以/应该在事务上下文中使用并行流吗?

介绍 长话短说&#xff0c;您不应在并行流中使用事务。 这是因为并行流中的每个线程都有其自己的名称&#xff0c;因此它确实参与了事务。 Streams API旨在在某些准则下正常工作。 实际上&#xff0c;为了受益于并行性&#xff0c;不允许每个操作更改共享对象的状态&#xff0…

插入排序java_「Java」各类排序算法

排序大的分类可以分为两种&#xff1a;内排序和外排序。在排序过程中&#xff0c;全部记录存放在内存&#xff0c;则称为内排序&#xff0c;如果排序过程中需要使用外存&#xff0c;则称为外排序。下面讲的排序都是属于内排序。内排序有可以分为以下几类&#xff1a;(1) 插入排…

java object... arguments_Java面试之基础题---对象Object

参数传递&#xff1a;Java支持两种数据类型&#xff1a;基本数据类型和引用数据类型。原始数据类型是一个简单的数据结构&#xff0c;它只有一个与之相关的值。引用数据类型是一个复杂的数据结构&#xff0c;它表示一个对象。原始数据类型的变量将该值直接存储在其存储器地址处…

华为光伏usb适配器_华为系列原装充电器拆解第三弹:比亚迪版华为10W充电器

在对华为18W充电器的比亚迪版和赛尔康版进行拆解之后&#xff0c;充电头网今天继续为大家带来华为10W充电器的比亚迪版和达宏版的拆解。这两种10W规格的华为充电器外观延续了华为原装充电器的风格&#xff0c;而且型号也是一样的。那么&#xff0c;我们先一起来看看比亚迪版华为…

JMetro版本11.5.10和8.5.10发布

在这里&#xff0c;我们再次使用JMetro的另一个版本。 此版本中的新增功能&#xff1a; 工具栏内控件的新样式 新的可编辑组合框样式 对其他样式的一些调整 一些修复 继续阅读以获取详细信息。 可编辑的ComboBox新样式 JMetro早期版本的可编辑ComboBox看起来非常糟糕&am…

1s后跳转 android_优雅保活方案,原来Android还可以这样保活

作者&#xff1a;NanBox保活现状我们知道&#xff0c;Android 系统会存在杀后台进程的情况&#xff0c;并且随着系统版本的更新&#xff0c;杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的&#xff0c;因为可以节省内存&#xff0c;降低功耗&#xff0c;也避免…

java mongo api_MONGODB的javaAPI简单应用

1 建立连接要建立MongoDB的连接&#xff0c;你只要指定要连接到的数据库就可以。这个数据库不一定存在&#xff0c;如果不存在&#xff0c;MongoDB会先为你建立这个库。同时&#xff0c;在连接时你也可以具体指定要连接到的网络地址和端口。下面的是连接本机数据库的一些例子&a…