cxf

十分钟学会XSD

Jun 9, 2015 | | Say something

XSD用来验证XML内容的有效性,当开发基于SOAP的WEB SERVICE时,发现我们经常需要定义wsdl。虽然”代码优先”的开发模式不需要我们手动书写wsdl。如果我们了解基本的XSD知识,那么我们就能更轻易的读懂wsdl的内容以及根据需要修改wsdl。 本文将开发一个验证代表学生成绩的XSD。 由于eclipse带有XSD的可视化编辑器。所以我使用eclipse来创建XSD,具体的步骤如下 一、新建一个工程,比如test-xsd 二、工程上右键->new->XML-XML Schema File->next 编辑完成后的结果如图: 三、在图中的type标签内添加你希望定义的类型(Type)。 常用的元素种类有simpleType和complexType,simpleType的作用是对已有的数据类型进行范围的限制,complexType定义复合的数据类型。eclipse的XSD编辑器只会帮我们生产XSD框架,具体的规则我们可以切换到source视图进行代码编辑。 四、本示例最后产生的XSD内容如下

对本示例使用的元素解释如下: 在本XSD中,没有带前缀的元素都来y于xmlns=”http://www.w3.org/2001/XMLSchema”命名空间,比如simpleType,complexType,element等等。 targetNamespace:表示本XSD中定义的element和type属于的namespace。防止命名冲突,和java的包的概念相同。 xmlns:tns:tns前缀表示本XSD的命名空间 elementFormDefault: 本XSD的元素默认是否需要带前缀,”unqualified”表示不带。 sex类型是一个枚举值。子元素<restriction>表示sex的基类为string。可选的值为”MAN”和”WOMAN”。<simpleType>合法的子元素还有<list>表示是列表,<union>指定的类型的联合。 username类型是满足”\w{2,6}”正则表达式的字符串。 score类型是规定了最小值和最大值的double值。 classScore是一个复合类型,定义了三个域,cid,cname, score。而score的类型为本XSD中定义的tns:score类型。<sequence>表示各个域安顺序排列,可选的还有<choice>任选一个,<all>全部但是可以任意排序。 student也是一个复合类型,值得注意的是属性minOccurs=”1″ 和maxOccurs=”unbounded”,表示该域至少出现一次,可以无限次。 五、工程上右键->new->XML->create XML file from an XML file->选择你的XSD文件。 产生的示例如下:

示例XML有两个classScore对象 虽然行文比较冲忙,但是也希望能给看官一点启发和帮助,欢迎留言反馈! 参考文档: Understanding XML Schema

[译]CXF 架构

May 31, 2015 | | Say something

原文地址:https://www.packtpub.com/books/content/cxf-architecture 下图显示了cxf整个的架构: Bus Bus是cxf架构的主心骨,cxf由一个基于spring的cxf.xml配置文件组成,在servlet初始化时通过SpringBusFactory加载。它为所有的endpoint定义了通用的上下文。它整合所有的运行时基础组件且提供了一个共用的应用程序上下文。SpringBusFactory扫描且加载classpath路径META-INF/cxf目录下相关的配置文件来相应的构建应用程序上下文。根据下面的文件构建应用程序上下文: META-INF/cxf/cxf.xml META-INF/cxf/cxf-extension.xml META-INF/cxf/cxf-property-editors.xml XML文件是CXF安装bundle的核心库的一部分。CXF在内部使用Spring作为它的配置。如下的XML片段展示cxf.xml中Bus定义 <bean id=”cxf” class=”org.apache.cxf.bus.CXFBusImpl” /> 核心的Bus组建是CXFBusImpl。这个类充当web service endpoint的incoming和outgoing请求的拦截器。这些拦截器一旦定义,对上下文的所以endpoints都是可用的。cxf文件也定义了其他的基础设施组件,比如BindingFactoryManager,ConduitFactoryManager等。这些组件是Bus的扩展。可用通过Bus.getExtension方法访问这些组件。这些基础设施组件注册之后便于查找,更新service endpoint级的各种参数,比如service binding, 传输协议,conduit(管道)等。 CXF Bus架构可以被覆盖,但是覆盖默认bus的行为需要小心。由于Bus是加载CXF运行时的核心组件,许多共享的对象作为运行时的一部分而加载。当覆盖默认的Bus时需要确保这些对象也被加载。 你可以扩展默认Bus来包含你自定义的组件或者服务对象,比如factory manager。你也可以向Bus添加拦截器。定义在Bus级的拦截器对所有的endpoint都适用。如下代码展示如何创建一个自定义的Bus。 SpringBeanFactory.createBus(“mycxf.xml”) SpringBeanFactory类用于创建Bus。你可以实现或者重写原始cxf.xml文件中定义的bean。为了让CXF加载mycxf.xml文件,需要让其在classpath或者你可以使用一个工厂方法来加载该文件。如下的代码演示使用Bus级的拦截器。

前面的bus定义添加了outgoing消息的日志拦截器。 Frontend CXF提供frontend模型概念,让你使用不同的frontend API创建web services。这些API让你使用简单工厂bean和JAX-WS实现创建web 服务。这些API也能让你创建动态web service客户端。CXF支持的主要的frontend是JAX-WS。 JAX-WS JAX-WS是开发,发布和消费web services的规范。JAX-WS简化web service开发。它定义基于java的API来减轻开发和部署web service。这个规范支持致力于web service互操作性的ws-basic profile 1.1。这意味着一个web service能被任何语言编写的客户端调用和消费。JAX-WS也定义了如JAXB和SAAJ等标准。CXF提供JAX-WS完整的支持。 JAXB提供便捷的映射XML schema到java POJO。JAXB屏蔽SOAP 消息的XML schema 格式消息到java代码转换。这样开发人员不用关心XML和SOAP的解析。JAXB规范定义java和XML schema的绑定。SAAJ提供了处理SOAP消息中XML附件标准。 JAX-WS提供将java 普通class 转换为web service的注解库,和从wsdl中定义的服务到实现服务的java类的映射,来加速web service开发。根据JAXB规范将wsdl中定义的任何复合的类型映射到java 类。 如前面讨论,存在两种开发web […more]

spring整合cxf开发JSON格式的RESTful风格web service

May 27, 2015 | | Say something

demo 下载: testcxf-rest.zip 一、前言 网上有很多这个话题的Demo,都不是maven版本,需要自己整理相应的jar包,我在此提供一个maven版本,下载后执行”mvn clean package”就可以直接打包,然后将war包部署到tomcat 容器就可以正常访问了,减少框架搭建的时间。 cxf的RESTful web service实现遵循”jax-rs”规范,默认采用xml格式传输,要使用JOSN格式传输,cxf使用jettison jar包来完成java pojo对象到JSON字符串的转换,所以我们需要添加如下的pom 依赖。

二、开发步骤: 1)使用maven向导产生一个web 工程。 2)添加相应的依赖 参考pom.xml 3)创建pojo对象,使用@XmlRootElement注解,这样可以使用JAXB完成xml转换,参考book.java和Category.java 4)创建CategoryService, 对使用到的”jax-rs”注解说明如下: @Path(“/categoryservice”) 映射http 请求路径,和spring mvc的@RequestMapping注解功能相似 @Produces({“application/xml”, “application/json”}) 表示产生的响应的格式,对应http 请求头的Accept. 和响应头Content-Type @GET,@DELETE,@POST,@PUT 对应http的Method,和spring mvc的@RequestMapping(method=RequestMethod.DELETE)用法相似,表示匹配哪种http请求。 @Path(“/category/{id}”) 表示@PATH支持path 变量,spring mvc也有类似的注解。 @Consumes({“application/xml”, “application/json”}) 表示接受的请求头的格式,对应http 请求头的Content-type 5)创建spring context xml,参考applicationContext.xml 和cxf相应的配置如下:

6)配置web.xml, 主要是CXFServlet 声明和spring applicationContext的声明 7)编译”mvn clean package”, […more]

将schema从cxf产生的wsdl分离

May 26, 2015 | | Say something

demo 下载:testcxf-java2ws.zip 对于代码优先的web service开发,cxf默认将所有的元素都产生在wsdl文件中,导致文件很庞大,而且相同的schema对象会在每个wsdl中有一份,但是cxf提供了强大的tool支持,只需要简单的几步,我们就可以将schema 定义从wsdl中分离出来,具体的步骤为: 一、创建一个SPE对象(就是一个带@WebService注解的接口)

相关的注释解释如下: @WebService 表示这是一个web service, targetNamespace对应产生的<wsdl:definitions targetNamespace=””>, serviceName我们希望的服务名, 对应<wsdl:service name> portName 对应<wsdl:port name=””> wsdlLocation指定wsdl文件的位置,我们下一步产生这个文件 二,使用java2ws产生对应的wsdl和xsd文件 1、java2ws是cxf开发工具包中的一个tool, 可以在http://cxf.apache.org/docs/interceptors.html地方下载最新的版本。 2、先将工程编译,产生HelloWorld.java对应的HelloWorld.calss文件 3、cd testcxf-java2ws\src\main\java 目录 4、java2ws -createxsdimports -wsdl -o HelloWorld.wsdl -d ../resources/ -cp “D:\Ted\TEST\testcxf-java2ws\target\testcxf-java2ws\WEB-INF\classes” -server -client cn.javacoder.testcxf.java2ws.HelloWorld 相关的选项解释如下: -createxsdimports 产生的wsdl和xsd分离 -wsdl -o HelloWorld.wsdl  表示产生名为HelloWorld.wsdl的wsdl文件 -d ../resources/ 产生的wsdl和xsd文件的输出位置 -cp “D:\Ted\TEST\testcxf-java2ws\target\testcxf-java2ws\WEB-INF\classes” 指定我们的HelloWorld.calss classpath -server -client […more]

使用CXF整合Spring开发web service

May 25, 2015 | | Say something

DEMO下载:test-cxf.zip CXF和sping具有很好的结合性,所以CXF是Java 程序员开发web service最佳的选择,本文是一个入门的例子,基本是Writing a service with Spring 的一个拷贝,希望能给那些不想去倒腾CXF官方例子的同仁一点帮助, 服务端的开发步骤: 1、新建maven工程,在pom.xml中添加相应的依赖。 2、定义pojo, 见User 3、定义SPE, 见HelloWorld.java 4、实现服务,见HelloWorldImpl.java 5、配置spring上下文,见applicationContext.xml 6,部署到web 容器,比如tomcat。 客户端的开发步骤 1、新建maven工程,在pom.xml中添加相应的依赖。 2、将服务端的pojo类和SPE拷贝过来,保持包名一致。 3、配置spring上下文,见applicationContext.xml 4、创建ClassPathXmlApplicationContext 进行测试。 记录下有用的点: 1、cxf默认使用的是Java SE Logging  日志框架,要想使用log4j, 需要在classpath中添加log4j.properties文件和提供”-Dorg.apache.cxf.Logger=org.apache.cxf.common.logging.Log4jLogger”jvm 参数,如图: 2、在web.xml中声明CXFServlet 的url-pattern时,最好不要映射成根路径,比如”/services/*”,这样所有的web service服务都部署在一个统一的路径中,而”/services”成为路径的一部分。 3、当使用soap协议时,使用jaxb框架来进行Java 类和xml 转换的,所以加上@XmlRootElement 注解。