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/363369.shtml

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

相关文章

用堆来求中位数

维护一个大根堆和一个小根堆。使得大根堆堆顶&#xff08;最大的元素&#xff09;比小根堆堆顶&#xff08;最小的元素&#xff09;小&#xff0c;且两个堆的元素个数的差小于等于1。这样元素多的那个堆的堆顶就是已读入数的中位数。如果读入偶数个数&#xff0c;则中位数为两个…

JPA 2.1类型转换器–保留枚举的更好方法

可以使用JPA 2.0保留枚举&#xff0c;但是没有很好的方法来实现。 使用Enumerated批注&#xff0c;可以使用EnumType.ORDINAL或EnumType.STRING将枚举值映射到其数据库表示形式。 但是这两种选择都有一些缺点&#xff0c;我们将在本文的第一部分中进行讨论。 在第二部分中&…

LOADRUNNER8.1中文版加10000客户端破解补订

http://www.17testing.com/download/LR_8.1.iso LOADRUNNER8.1 用迅雷下载http://www.17testing.com/download/LR_8.1ChinesePack.iso 中文包http://blog.chinaunix.net/upfile/070509151030.rar 10000客户端的破解补丁 LR 8.1的介质可以从这里下载&#xff1a;http://www.17t…

css布局笔记(二)Flex

flex Flex是“Flexible Box”的缩写&#xff0c;意为“弹性布局”&#xff0c;用来为盒状模型提供最大的灵活性。 任何一个容器都可指定为Flex布局。 .box{display:flex;} 行内元素也可以使用flex布局。 .box{display:inline-flex;} webkit内核的浏览器&#xff0c;必须加上-w…

BZOJ3709 Bohater 贪心

传送门 思路很妙…… 有个前提条件&#xff1a;血量无限&#xff0c;这样话肯定先打会回血的怪&#xff0c;再打会掉血的怪 对于会回血的怪&#xff0c;按照受到伤害的顺序从小往大打 对于会掉血的怪似乎并不是很好搞&#xff0c;考虑&#xff1a;将每一时刻的血量函数画出来&a…

反射与二次加工标准类型

反射与二次加工标准类型一、反射 反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。 有四个可以实现自省(反射)的函数&#xff0c;如下表所示&#xff1a; 函数名含义hasattr(object,name)判断object中有没有一个name字符串对应的方法或属性getattr(object,na…

Java 8 StampedLocks与ReadWriteLocks和同步

同步部分就像访问您的岳父母。 您希望尽可能少出现。 关于锁定&#xff0c;规则是相同的–您想花费最短的时间在关键区域内获取锁定&#xff0c;以防止形成瓶颈。 锁定的核心语言惯用法一直是用于方法和离散块的synced关键字。 这个关键字实际上已硬连接到HotSpot JVM中。 我们…

MSN on 2/16/2009

转载于:https://www.cnblogs.com/zxlin25/archive/2009/02/16/1391207.html

开发微信小程序中SSL协议的申请、证书绑定、TLS 版本处理等

在上篇随笔《基于微信小程序的系统开发准备工作》介绍了开发微信小程序的一些前期的架构设计、技术路线 、工具准备等方面内容&#xff0c;本篇随笔继续这个步骤&#xff0c;逐步介绍我们实际开发过程中对SSL协议的申请及后期处理过程&#xff0c;包括证书的IIS端口绑定&#x…

POJ 3253 Fence Repair

POJ 3253 Fence Repair 题目链接&#xff1a;http://poj.org/problem?id3253 题目大意 农夫约翰想修理牧场周围的一小段篱笆。他测量了栅栏&#xff0c;发现他需要N(1≤N≤20,000)块木板&#xff0c;每块长度为整数Li(1≤Li≤50,000)。然后&#xff0c;他买了一块长木板&#…

【面向对象】对比JavaScript、Go、Ada、Python、C++、Java、PHP的访问限制。

在不同编程语言中&#xff0c;控制成员&#xff08;变量、方法、类等&#xff09;可见性的机制不尽相同。以下是对比JavaScript、Go、Ada、Python、C、Java、PHP所使用的访问限制关键字和约定&#xff1a; 一、JavaScript ### JavaScript访问限制 早期的JavaScript并没有类似…

C#各类访问权限,封装,修饰符

C#各类访问权限&#xff0c;封装&#xff0c;修饰符。 (1) Pubilc &#xff1a;任何公有成员可以被外部的类访问。(2) Private &#xff1a;只有同一个类中的函数可以访问它的私有成员。(3) Protected &#xff1a;该类内部和继承类中可以访问。(4) internal : 同一个程序集的对…

在Java 8中使用Stream API列出ZIP文件的内容

在Java 8 java.util.zip.ZipFile配备了stream方法&#xff0c;该方法可以非常轻松地浏览ZIP文件条目。 在此博客文章中&#xff0c;我将展示许多示例&#xff0c;这些示例显示了我们可以如何快速浏览ZIP文件条目。 注意&#xff1a;就本博客而言&#xff0c;我将一个GitHub存储…

tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法...

tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法 【标 题】&#xff1a;tomcat5下jsp出现getOutputStream() has already been called for this response异常的原因和解决方法【关键字】&#xff1a;tomcat5,jsp,getOutpu…

Web API应用架构设计分析(1)

Web API 是一种应用接口框架&#xff0c;它能够构建HTTP服务以支撑更广泛的客户端&#xff08;包括浏览器&#xff0c;手机和平板电脑等移动设备&#xff09;的框架&#xff0c; ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。本文主要以AS…

记手机端 下拉加载新数据

$(#container).unbind("scroll").bind(scroll,function(e){var sum this.scrollHeight - 5;console.log(sum)console.log($(this).scrollTop() $(this).height())if(sum <$(this).scrollTop() $(this).height()){ getmore();       }     }) $(#co…

一个切图仔的 CSS 笔记

1&#xff0c;flexbox~注意&#xff0c;设为 Flex 布局以后&#xff0c;子元素的float、clear和vertical-align属性将失效。 在ios8上要加上前缀 display: -webkit-box; display: -webkit-flex; display: -webkit-box; /* Chrome 4, Safari 3.1, iOS Safari 3.2 */ display: …

如何使用JPA Type Converter加密数据

几天前&#xff0c;我读了Bear Giles关于2012年使用JPA监听器进行数据库加密的有趣文章。他讨论了对加密解决方案的要求&#xff0c;并提供了JPA监听器的代码示例。 他的主要要求是&#xff1a; 提供不影响应用程序的透明加密&#xff0c; 能够在部署时添加加密&#xff0c; …

go语言的排序和去重

go语言的排序&#xff1a; https://blog.csdn.net/u010983881/article/details/52460998 go语言去重&#xff1a; https://blog.csdn.net/qq_27068845/article/details/77407358 通过构造set去重&#xff08;go中没有set&#xff09;&#xff1a; https://studygolang.com/arti…

MapXtreme2008中操作矢量符号和定制符号

本文部分说明内容摘自网络文章&#xff0c;经过本人在MapXtreme2008中编写相关的演示例子&#xff0c;详细说明如何操作MapXtreme2008提供的矢量符号和定制符号。 MapXtreme 在其安装过程中自动安装 10 种 MapInfo 特定的 TrueType 字体。这些字体为用户提供了字形符号选择&am…