Apache CXF 3.0: CDI 1.1 Support as Alternative to Spring--reference
With Apache CXF 3.0 just being released a couple of weeks ago, the project makes yet another important step to fulfill the JAX-RS 2.0 specification requirements: integration with CDI 1.1. In this blog post we are going to look on a couple of examples of how Apache CXF 3.0 and Apache CXF 3.0 work together.
Starting from version 3.0, Apache CXF includes a new module, named cxf-integration-cdi which could be added easily to your Apache Maven POM file:
1.<dependency>
2.<groupId>org.apache.cxf</groupId>
3.<artifactId>cxf-integration-cdi</artifactId>
4.<version>3.0.0</version>
5.</dependency>
This new module brings just two components (in fact, a bit more but those are the key ones):
- CXFCdiServlet: the servlet to bootstrap Apache CXF application, serving the same purpose asCXFServlet and CXFNonSpringJaxrsServlet, ...
- JAXRSCdiResourceExtension: portable CDI 1.1 extension where all the magic happens
When run in CDI 1.1-enabled environment, the portable extensions are discovered by CDI 1.1 container and initialized using life-cycle events. And that is literally all what you need! Let us see the real application in action.
We are going to build a very simple JAX-RS 2.0 application to manage people using Apache CXF 3.0 andJBoss Weld 2.1, the CDI 1.1 reference implementation. The Person class we are going to use for a person representation is just a simple Java bean:
01.package com.example.model;
02.
03.public class Person{
04.private String email;
05.private String firstName;
06.private String lastName;
07.public Person(){
08.}
09.public Person(final String email, final String firstName, final StringlastName){
10.this.email = email;
11.this.firstName = firstName;
12.this.lastName = lastName;
13.}
14.//getters and setters are ommited
15.//...
As it is quite common now, we are going to run our application inside embedded Jetty 9.1 container and ourStarter class does exactly that:
Please notice the presence of CXFCdiServlet and two mandatory listeners which were added to the context:
- org.jboss.weld.environment.servlet.Listener is responsible for CDI injections
- org.jboss.weld.environment.servlet.BeanManagerResourceBindingListener binds the reference to the BeanManager to JNDI location java:comp/env/BeanManager to make it accessible anywhere from the application
With that, the full power of CDI 1.1 is at your disposal. Let us introduce the PeopleService class annotated with @Named annotation and with an initialization method declared and annotated with @PostConstruct just to create one person.
Up to now we have said nothing about configuring JAX-RS 2.0 applications and resources in CDI 1.1enviroment. The reason for that is very simple: depending on the application, you may go with zero-effort configuration or fully customizable one. Let us go through both approaches.
With zero-effort configuration, you may define an empty JAX-RS 2.0 application and any number of JAX-RS 2.0 resources: Apache CXF 3.0 implicitly will wire them together by associating each resource class with this application. Here is an example of JAX-RS 2.0 application:
And here is a JAX-RS 2.0 resource PeopleRestService which injects the PeopleService managed bean:
01.package com.example.rs;
02.
03.import java.util.Collection;
04.
05.import javax.inject.Inject;
06.import javax.ws.rs.DELETE;
07.import javax.ws.rs.DefaultValue;
08.import javax.ws.rs.FormParam;
09.import javax.ws.rs.GET;
10.import javax.ws.rs.POST;
11.import javax.ws.rs.PUT;
12.import javax.ws.rs.Path;
13.import javax.ws.rs.PathParam;
14.import javax.ws.rs.Produces;
15.import javax.ws.rs.QueryParam;
16.import javax.ws.rs.core.Context;
17.import javax.ws.rs.core.MediaType;
18.import javax.ws.rs.core.Response;
19.import javax.ws.rs.core.UriInfo;
20.
21.import com.example.model.Person;
22.import com.example.services.PeopleService;
23.
24.@Path( "/people" )
25.public class PeopleRestService {
26.@Inject private PeopleService peopleService;
27.
28.@Produces( { MediaType.APPLICATION_JSON } )
29.@GET
30.public Collection< Person > getPeople( @QueryParam( "page")@DefaultValue( "1" ) final int page ) {
31.// ...
32.}
33.
34.@Produces( { MediaType.APPLICATION_JSON } )
35.@Path( "/{email}" )
36.@GET
37.public Person getPerson( @PathParam( "email" ) final String email ) {
38.// ...
39.}
40.
41.@Produces( { MediaType.APPLICATION_JSON } )
42.@POST
43.public Response addPerson( @Context final UriInfo uriInfo,
44.@FormParam( "email" ) final String email,
45.@FormParam( "firstName" ) final String firstName,
46.@FormParam( "lastName" ) final String lastName ) {
47.// ...
48.}
49.
50.// More HTTP methods here
51.// ...
52.}
Nothing else is required: Apache CXF 3.0 application could be run like that and be fully functional. The complete source code of the sample project is available on GitHub. Please keep in mind that if you are following this style, only single empty JAX-RS 2.0 application should be declared.
With customizable approach more options are available but a bit more work have to be done. Each JAX-RS 2.0 application should provide non-empty getClasses() or/and getSingletons() collections implementation. However, JAX-RS 2.0 resource classes stay unchanged. Here is an example (which basically leads to the same application configuration we have seen before):
01.package com.example.rs;
02.
03.import java.util.Arrays;
04.import java.util.HashSet;
05.import java.util.Set;
06.
07.import javax.enterprise.inject.Produces;
08.import javax.inject.Inject;
09.import javax.ws.rs.ApplicationPath;
10.import javax.ws.rs.core.Application;
11.
12.import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;
13.
14.@ApplicationPath( "api" )
15.public class JaxRsApiApplication extends Application {
16.@Inject private PeopleRestService peopleRestService;
17.@Produces private JacksonJsonProvider jacksonJsonProvider = newJacksonJsonProvider();
18.
19.@Override
20.public Set< Object > getSingletons() {
21.return new HashSet<>(
22.Arrays.asList(
23.peopleRestService,
24.jacksonJsonProvider
25.)
26.);
27.}
28.}
Please notice, that JAXRSCdiResourceExtension portable CDI 1.1 extension automatically creates managed beans for each JAX-RS 2.0 applications (the ones extending Application) and resources (annotated with@Path). As such, those are immediately available for injection (as for example PeopleRestService in the snippet above). The class JacksonJsonProvider is annotated with @Provider annotation and as such will be treated as JAX-RS 2.0 provider. There are no limit on JAX-RS 2.0 applications which could be defined in this way. The complete source code of the sample project using this appoarch is available on GitHub
No matter which approach you have chosen, our sample application is going to work the same. Let us build it and run:
1.> mvn clean package2.> java -jar target/jax-rs-2.0-cdi-0.0.1-SNAPSHOT.jarCalling the couple of implemented REST APIs confirms that application is functioning and configured properly. Let us issue the GET command to ensure that the method of PeopleService annotated with @PostConstructhas been called upon managed bean creation.
And here is the example of POST command:
In this blog post we have just scratched the surface of what is possible now with Apache CXF and CDI 1.1integration. Just to mention that embedded Apache Tomcat 7.x / 8.x as well as WAR-based deployments ofApache CXF with CDI 1.1 are possible on most JEE application servers and servlet containers.
Please take a look on official documentation and give it a try!
The complete source code is available on GitHub.
reference :http://java.dzone.com/articles/apache-cxf-30-cdi-11-support
Apache CXF 3.0: CDI 1.1 Support as Alternative to Spring--reference的更多相关文章
- Apache CXF实现Web Service(4)——Tomcat容器和Spring实现JAX-RS(RESTful) web service
准备 我们仍然使用 Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service 中的代码作为基础,并 ...
- Apache CXF实现Web Service(5)—— GZIP使用
Apache CXF实现Web Service(5)-- GZIP使用 参考来源: CXF WebService整合Spring Apache CXF实现Web Service(1)--不借助重量级W ...
- NoClassDefFoundError: Could not initialize class org.apache.cxf.jaxrs.provider.ProviderFactory org.springframework.aop.support.AopUtils.isCglibProxyClass
报错: 2018-05-03 10:35:20 377 ERROR org.apache.juli.logging.DirectJDKLog.log:181 - Servlet.service() f ...
- Apache CXF 102 CXF with REST
前言 续上篇Apache CXF 101,摘抄部分REST概念性知识,以运行实例考察CXF对REST的支持. 目录 1 REST简介 2 工具 3 运行实例 内容 本Spike记录中内容,如无特别指出 ...
- Apache CXF 例子
来自:http://www.cnblogs.com/frankliiu-java/articles/1641949.html Apache CXF 是一个开放源代码框架,是在Xfire 跟Celtix ...
- Cxf + Spring3.0 入门开发WebService
转自原文地址:http://sunny.blog.51cto.com/182601/625540/ 由于公司业务需求, 需要使用WebService技术对外提供服务,以前没有做过类似的项目,在网上搜寻 ...
- apache cxf笔记之Spring客户端访问和调用webservice服务
继续上次的spring服务的问题,这边介绍一种spring配置客户端的方法. 1.src目录下新建client-beans.xml文件 <?xml version="1.0" ...
- Apache CXF入门
CXF简介 Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了.CXF 继承了 Celtix 和 XFire 两大 ...
- 分布式架构探索 - 2. WebService RPC框架之Apache CXF
Apache CXF是一个开源的WebService RPC框架. 例子: 1. 新建一个maven web项目, 添加pom 如下: <?xml version="1.0" ...
随机推荐
- nutch2.2.1
http://blog.csdn.net/leave00608/article/details/17442163 https://svn.apache.org/repos/asf/nutch/tags ...
- django入门教程(上)
相信用过python的人都听过Django的大名,知道它是一个web框架,用来支持动态网站.网络应用程序以及网络服务的开发.那么为什么我们需要一个web框架,而不是直接用python来写web应用呢? ...
- bzoj 3283: 运算器 扩展Baby Step Giant Step && 快速阶乘
3283: 运算器 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 184 Solved: 59[Submit][Status][Discuss] D ...
- 用 NSURProtocol 注入测试数据
在之前的几篇博文中,笔者介绍过访问异步网络的单元测试方法及如何使用模拟对象来进一步控制单元测试的范围.在今天的教程中,笔者将展示另一种方法,即:通过自定义 NSURProtocol 类来获取静态测试数 ...
- [转贴]JAVA :CXF 简介
Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF.CXF 继 ...
- 【Xamarin挖墙脚系列:Xamarin开发环境配置需求】
原文:[Xamarin挖墙脚系列:Xamarin开发环境配置需求] 前言 因为操作的全是大块头,加大你们的内存,CPU网上飙.... 卤煮的机器配置 最近的版本部署包,百度云离线下载:版本:Xama ...
- .net 利用 GZipStream 压缩和解压缩
1.GZipStream 类 此类在 .NET Framework 2.0 版中是新增的. 提供用于压缩和解压缩流的方法和属性 2.压缩byte[] /// <summary> /// 压 ...
- (转载)Flash Loader加载完成不发送COMPLETE和ERROR事件的问题分析
(转载)http://blog.dou.li/flash-loader%E5%8A%A0%E8%BD%BD%E5%AE%8C%E6%88%90%E4%B8%8D%E5%8F%91%E9%80%81co ...
- struts2错误:The Struts dispatcher cannot be found.
struts2错误:The Struts dispatcher cannot be found. The Struts dispatcher cannot be found. This is usua ...
- poj magic number
Problem H Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Sub ...