一)
Java项目代码调用服务:
注意,此处所说的是在Java项目中调用Spring的服务,并不是在JavaEE项目中调用
使用纯Java项目调用方法
1、根据客户端生成的代码来调用。(优选这种方式)
请先生成然后在任意的Java项目中调用 。
2、客户端只拥有一个接口,使用JaxWsProxyFactoryBean来调用。
•因为以下使用了JaxWsProxyFactoryBean,所以,仍然需要CXF的环境,而使用此环境就会造成Jar文件的大量冗余,所以大家要谨慎选择。
二)
在Spring项目中,通过配置文件调用:
以下是使用Spring的配置文件调用:
1.新建立一个Java项目,并加载cxf的所有包。
2.只需要生成的接口文件。
利用wsdl2java命令生产代码,我们只需要一个接口文件,命令:wsdl2java -d . http://localhost:8080/CXF_3/cxf/hi?wsdl;
只把接口类拷贝到客户端代码中即可,把出错的地方删掉即可。如将生成的接口IHiService类拷贝到项目中,
package cn.itcast.cxf;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
import com.cxf.client.ObjectFactory;
/**
* This class was generated by Apache CXF 2.4.2
* 2015-08-20T15:15:00.693+08:00
* Generated source version: 2.4.2
*
*/
@WebService(targetNamespace = "http://cxf.itcast.cn/", name = "IHiService")
@XmlSeeAlso({ObjectFactory.class})
public interface IHiService {
@WebResult(name = "return", targetNamespace = "")
@RequestWrapper(localName = "sayHi", targetNamespace = "http://cxf.itcast.cn/", className = "cn.itcast.cxf.SayHi")
@WebMethod
@ResponseWrapper(localName = "sayHiResponse", targetNamespace = "http://cxf.itcast.cn/", className = "cn.itcast.cxf.SayHiResponse")
public java.lang.String sayHi(
@WebParam(name = "arg0", targetNamespace = "")
java.lang.String arg0
);
}
3.在classpath下新建立一个ClientBeans.xml文件.
创建ClientBeans.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">
<!-- id:唯一性标示 address:请求的服务地址(不是发布的服务地址) serviceClass:依赖额接口类 -->
<jaxws:client id = "hiService" address = "http://localhost:8080/CXF_3/cxf/hi"
serviceClass = "cn.itcast.cxf.IHiService">
</jaxws:client>
</beans>
4.创建App类,访问服务:
package cn.itcast.cxf;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 通过spring配置文件的方式调用webService服务
* @author wangz_ing
*
*/
public class App {
public static void main(String[] args) {
ApplicationContext cxt = new ClassPathXmlApplicationContext("cn/itcast/cxf/ClientBean.xml");
IHiService s = (IHiService) cxt.getBean("hiService");
String ret = s.sayHi("aa");
System.out.println(ret);
}
}
•
•优点与缺点:
•此种情况,适合于一个Javaweb项目已经集成了Spring。并希望通过CXF配置的方式调用Web服务。
•此种情况,仍然需要导入CXF的大量jar包。
•这种情况也存在一定人优点,如可以将外部的Web服务通过配置文件注入(DI)到Action类中。
关于web项目配置的说明1
l如果在项目中仅发布webservice,则可以只配置以下内容。
l同时默认即是读取WEB-INF/cxf-servlet.xml文件,所以是否指定都可以。
l但一般情况下,一个web项目,在使用了Spring之后,往往会通过ApplicationContext获取一些服务,此时则必须注册Spring的监听器。即以下代码:
下面为一个完整的web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/cxf-itcast.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<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>/ws/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
l在上页中出现的重复引入问题,可以修改cxf-servlet.xml文件。
l修改后,CXFServlet类将不能自动加载cxf-servlet.xml文件,此时将导致名为cxf的bean加载不成功。
l为解决此问题必须在重新命名的配置文件中加入以下代码,以启动CXF:
即:如果你是用contextConfigLocation加载的配置文件,则必须要加入以下代码。
<!-- 关于cxf配置的注意事项
如果没有提供给cxf默认的/WEB-INF/cxf-servlet.xml配置文件,则必须要在spring的配置文件
中配置以下三行配置。否则将不能加载名称为cxf的bean.从而启动失败。
-->
<import resource="classpath:META-INF/cxf/cxf.xml"/>
<importresource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
<importresource="classpath:META-INF/cxf/cxf-servlet.xml"/>