cxf2.X开发

来源:互联网 发布:云南白药 知乎 编辑:程序博客网 时间:2024/04/28 19:29

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


package com.linzl.cn.service;import javax.jws.WebParam;import javax.jws.WebService;@WebServicepublic interface ApprovalService { public String simpleMethod(@WebParam(name = "param") String param);}
package com.linzl.cn.service;import javax.jws.WebService;@WebServicepublic 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);// 发布的地址可以自己定义,浏览器访问时要加上 ?wsdlfactory.setAddress("http://localhost:8080/cxfHandPublish");factory.setServiceBean(implObj);// 创建WebServicefactory.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?wsdlserverFactoryBean.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依赖于服务器端接口的方式(待补充)
 



0 0