几周前刚刚发布了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

Apache CXF 3.0:CDI 1.1支持替代Spring相关推荐

  1. Apache CXF 3.0:CDI 1.1支持可替代Spring

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

  2. Apache CXF 3.0:JAX-RS 2.0和Bean验证1.1最终一起

    即将发布的出色的Apache CXF框架3.0版 (当前处于里程碑2阶段)带来了许多有趣且有用的功能,越来越接近提供完整的JAX-RS 2.0支持. Bean Validation 1.1的支持是我们 ...

  3. Apache CXF 简介

    Apache CXF 简介 开放源代码的服务框架 本教程介绍了 Apache CXF 服务框架的基本知识,并通过讲解自带的例子来初步体验通过 CXF 进行服务的发布与消费:然后搭建基于 Eclipse ...

  4. Apache Spark 3.0 预览版正式发布,多项重大功能发布

    今天早上 06:53(2019年11月08日 06:53) 数砖的 Xingbo Jiang 大佬给社区发了一封邮件,宣布 Apache Spark 3.0预览版正式发布,这个版本主要是为了对即将发布 ...

  5. 解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题

    在项目中使用Apache开源的Services Framework CXF来发布WebService,CXF能够很简洁与Spring Framework 集成在一起,在发布WebService的过程中 ...

  6. 【转】使用Apache CXF开发WebServices服务端

    原地址:http://cnjava.blog.51cto.com/1208887/335630 在前一篇的博客中,我使用Xfire1.x来开发了WebServies的服务端. 但是如果你访问Apach ...

  7. 使用apache CXF和maven开发Web Service

    来源:http://www.cnblogs.com/holbrook/archive/2012/12/12/2814821.html 目前主要的java webservice框架剩下了axis2和cx ...

  8. jax-ws cxf_走向REST:在Spring和JAX-RS(Apache CXF)中嵌入Jetty

    jax-ws cxf 对于服务器核心Java开发人员来说,向世界"展示"的唯一方法是使用API​​. 今天的帖子都是关于JAX-RS的 :使用Java编写和公开RESTful服务. ...

  9. 超越JAX-RS规范:Apache CXF搜索扩展

    在今天的帖子中,我们将超越JAX-RS 2.0规范,并探索Apache CXF (流行的JAX-RS 2.0实现之一)为REST服务和API开发人员提供的有用扩展. 特别是,我们将讨论使用OData ...

最新文章

  1. Java B2B2C o2o多用户商城 springcloud架构 (六)分布式配置中心(Spring Cloud Config)
  2. Java设计模式(六):命令设计模式
  3. 转工厂方法模式-想吃什么汉堡自己要
  4. iis创建php网站,iis怎么搭建php
  5. ellen 纽奥良大学演讲
  6. Rabbtmq Confirm 确认消息
  7. android touch事件坐标原点,Android – 捏缩放ontouch事件坐标
  8. 百度 UEditor--自定义上传文件路径及读取文件
  9. wordpress之插件安装和主题安装(包含常见问题)
  10. 衬线字体和无衬线字体区别
  11. 【架构干货】京东是如何抗住今年春晚百亿次互动的?
  12. php调用shell执行scp,使用shell脚本自动执行scp文件传输
  13. html+监听+页面滚动到底部,JS监听页面滚动到底部事件
  14. node-js——将excel表格转换成json文件
  15. 记sqoop导入hive时的一次报错
  16. 系统安全与应用【上】
  17. 【1+X Web前端等级考证 】 | Web前端开发中级理论 (附答案)
  18. 配置计算机名和工作组,TCP/IP地址配置,网络连通性测
  19. 将两个iso镜像刻录到一张dvd光盘上,当然是做系统启动盘用
  20. Win11系统更新KB5014668后点开始按钮没反应怎么办?

热门文章

  1. Ch5702-Count The Repetitions【字符串,倍增,dp】
  2. 【树形区间DP】加分二叉树(ssl 1033/luogu 1040)
  3. 面试了 N 个候选人后,我总结出这份 Java 面试准备技巧
  4. 一次恐怖的 Java 内存泄漏排查实战
  5. 一张图搞清楚Java异常机制
  6. Mysql常用语法总结
  7. 最全三大框架整合(使用映射)——数据库资源文件jdbc.properties
  8. struts+hibernate+oracle+easyui实现lazyout组件的简单案例——EmpDao层代码
  9. JAVA集合(笔记)
  10. CentOS - 修改主机名教程(将 localhost.localdomain 改成其它名字)