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
xsi:schemaLocation=" http://java.sun.com/xml/ns/javaee           
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 依赖于服务器端接口的 方式(待补充)
 



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值