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依赖于服务器端接口的方式(待补充)