cxf2.X开发

1、main方式发布webservice服务(引入cxf jar包)

package com.linzl.cn.service;  
import javax.jws.WebParam;  
import javax.jws.WebService;  
@WebService  
public interface ApprovalService {  
 public String simpleMethod(@WebParam(name = "param") String param);  
} 
package com.linzl.cn.service;  
import javax.jws.WebService;  
@WebService  
public class ApprovalServiceImpl implements ApprovalService {  
 public String simpleMethod(String status) {  
  System.out.println("被远程调用了");  
  return "我是实现类";  
 }  
}  
package com.linzl.cn.cxfPublish;  

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;  

import com.linzl.cn.service.ApprovalService;  
import com.linzl.cn.service.ApprovalServiceImpl;  

/** 
 * 手动发布webservice服务 
 *  
 * @author linzl 最后修改时间:2014年10月11日 
 */  
public class CxfHandPublish {  

public void publishApprovalService() {  
this.publish(ApprovalService.class, new ApprovalServiceImpl());  
}  

private void publish(Class<?> clazz, Object implObj) {  
// 创建WebService服务工厂  
// ServerFactoryBean factory = new ServerFactoryBean();  
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();  
// factory.getInInterceptors().add(new LoggingInInterceptor());//可选  
// factory.getOutInterceptors().add(new LoggingOutInterceptor());//可选  
// 注册WebService接口  
factory.setServiceClass(clazz);  
// 发布的地址可以自己定义,浏览器访问时要加上 ?wsdl  
factory.setAddress("http://localhost:8080/cxfHandPublish");  
factory.setServiceBean(implObj);  
// 创建WebService  
factory.create();  
}  

public static void main(String[] args) {  
new CxfHandPublish().publishApprovalService();  
}  
}

2、不基于Spring的方式发布webservice服务到中间件(引入cxf jar包)

package com.linzl.cn.cxfPublish;  

import javax.servlet.ServletConfig;  

import org.apache.cxf.jaxws.JaxWsServerFactoryBean;  
import org.apache.cxf.transport.servlet.CXFNonSpringServlet;  

import com.linzl.cn.service.ApprovalServiceImpl;  

/** 
 * 写一个servlet继承CXFNonSpringServlet 
 * 伴随web启动,自动发布webservice服务;不依赖于spring 
 *  
 * @author linzl 最后修改时间:2014年10月11日 
 */  
public class CxfAutoPublish extends CXFNonSpringServlet {  

private static final long serialVersionUID = 1L;  

protected void loadBus(ServletConfig servletConfig) {  
super.loadBus(servletConfig);// 一定要有  

JaxWsServerFactoryBean serverFactoryBean = new JaxWsServerFactoryBean(); // server工厂  
serverFactoryBean.setServiceClass(ApprovalServiceImpl.class);// 接口类  
serverFactoryBean.setAddress("/publishAddress"); // 服务请求路径  
// 得到最后的webservice服务地址为  
// http://localhost:8080/项目名称/services/publishAddress?wsdl  
serverFactoryBean.setServiceBean(new ApprovalServiceImpl());  
serverFactoryBean.create();  
}  

}  
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_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>cxfNoSpring</display-name>
<servlet>
<servlet-name>cxfAutoPublish</servlet-name>
<servlet-class>com.linzl.cn.cxfPublish.CxfAutoPublish</servlet-class>
<!-- 数字越小,越先启动 -->
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>cxfAutoPublish</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>

3、集成Spring,替换web.xml,增加/WEB-INF/cxf-servlet.xml

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_2_5.xsd"
id="WebApp_ID" version="2.5">
    <display-name>cxf</display-name>
    <servlet>
        <description>Apache CXF Endpoint</description>
        <display-name>cxf</display-name>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
</web-app>
cxf-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- START SNIPPET: beans -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- 第一种发布方式,只是cxf的实现类不同 -->
<jaxws:server id="testWebService" serviceClass="com.ws.CXFWebService" address="/publishAddress">
<jaxws:serviceBean>
<bean class="com.ws.impl.CXFWebServiceImpl" />
</jaxws:serviceBean>
</jaxws:server>
<!-- 第二种发布方式,只是cxf的实现类不同 -->
<!-- <jaxws:endpoint id="testWebService" implementor="com.ws.impl.CXFWebServiceImpl" -->
<!-- address="/publishAddress" /> -->
</beans>
<!-- END SNIPPET: beans -->

最后得到wsdl的访问地址
http://localhost:8080/项目名称/services/publishAddress?wsdl


4、cxf 客户端调用webservice服务

A、使用直接调用,不依赖服务器端接口的方式(可以调用不同语言编写的webserivce服务)

JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
// 此处的url一定要加上?wsdl
Client client == clientFactory.createClient("http://localhost:8080/jdkPublish?wsdl");
//参数值如果是和服务端接口的VO一样,则必须两端VO必须在同名目录下,否则转换失败
Object[] result = client.invoke(方法名, 参数值);
System.out.println(result[0]);

B、依赖于服务器端接口的方式,减少调用的复杂性(如传参数为复杂对象)

生成客户端代码 详细可通过wsdl2java -help查看
wsdl2java  wsdl的url

JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
factoryBean.getInInterceptors().add(new LoggingInInterceptor());// 可选
factoryBean.getOutInterceptors().add(new LoggingOutInterceptor());// 可选
factoryBean.setServiceClass(ApprovalService.class);
factoryBean.setAddress("http://localhost:8080/jdkPublish");// 没问题

//客户端要有对应的webservice服务的接口类,这样就可以直接调用接口类的方法了
ApprovalService approvalService = (ApprovalService) factoryBean.create();

C、集成spring依赖于服务器端接口的方式(待补充)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值