简单的CXF实例
用cxf写一个简单的手机号查询案例
首先需要下载 CXF
下载地址 http://cxf.apache.org/download.html
Source distribution 是带源码的压缩包 我们选择Binary distribution 中压缩包就可以
下载之后需要配置cxf环境
新建 CXF_HOME 地址 E:\apache-cxf-2.7.7
Path %CXF_HOME%\bin;
配置好环境变量之后 cmd 输入 wsdl2java -h 如果不报错 恭喜你,cxf配置成功
1.利用cxf访问其他系统接口
新建一个javaweb项目 webserviceTest
然后利用 CXF 生成客户端
命令行 进入 项目的src文件夹 输入 wsdl2java -p com.example.client.mobile -encoding utf-8 http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL
-p 是生成代码时直接的文件路径 -encoding 指定编码格式 后面为wsdl 地址
如果报错
Exception in thread "main" java.lang.AssertionError: org.xml.sax.SAXParseExcepti
on; systemId: jar:file:/E:/apache-cxf-2.7.7/lib/jaxb-xjc-2.2.6.jar!/com/sun/tool
s/xjc/reader/xmlschema/bindinfo/binding.xsd; lineNumber: 52; columnNumber: 88; s
chema_reference: 由于 accessExternalSchema 属性设置的限制而不允许 'file' 访问,
因此无法读取方案文档 'xjc.xsd'。
那就因为 jdk8 跟 cxf 2.7.7 版本不兼容
解决方法 1 在jre/lib下 新建一个 jaxp.properties 内容 javax.xml.accessexternalschema =all
解决方法 2 更好CXF版本 下载3.0的版本
生成客户端的目录为
建一个测试类 MobileTest
public class MoblieTest {
public static void main(String[] args) {
//创建web服务代理工厂
JaxWsProxyFactoryBean bean = new JaxWsProxyFactoryBean();
//设置要调用的web服务服务端发布地址
bean.setAddress("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?WSDL");
//设置要调用的web服务
bean.setServiceClass(MobileCodeWSSoap.class);
//创建web服务对象
MobileCodeWSSoap soap = (MobileCodeWSSoap) bean.create();
//通过对象调用web服务的方法
String resutl = soap.getMobileCodeInfo("15888888888", "");
System.out.println(resutl);
}
}
运行结果为 15888888888:浙江 杭州 浙江移动全球通卡
2. 自己创建一个webservice
首先新建一个javaweb项目 webserviceTest
(1)配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>webserviceTest</display-name>
<!--这个标签的主要作用是 在项目启动之前,先运行。例如要加载数据库等,就可以在这里配置-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
(2) 新增一个接口 HelloWorld 并增加实现类 HelloWorldImpl
package com.example.services;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
void sayHello(String name);
}
package com.example.services.impl;
import com.example.services.HelloWorld;
public class HelloWorldImpl implements HelloWorld {
@Override
public void sayHello(String name) {
System.out.println("hello world "+name);
}
}
(3)添加cxf的配置 在WEB-INF目录下新建一个applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- service -->
<bean id="helloWorld" class="com.example.services.impl.HelloWorldImpl"></bean>
<!--
发布服务
使用jaxws:server和jaxws:endpoint可以发布服务
WebService地址=Tomcat地址值+CXF Servlet的路径+ /weather
-->
<jaxws:server address="/hello" serviceClass="com.example.services.HelloWorld">
<jaxws:serviceBean>
<ref bean="helloWorld"/>
</jaxws:serviceBean>
</jaxws:server>
</beans>
启动项目 访问 http://localhost:8080/webserviceTest
接口生成成功