由于cxf2.2.3客户端动态调用不支持jdk1.7,在客户端调用时始终报错“javac:目标类1.5与源运行类1.7不兼容“问题,因为生产环境是jdk1.7,不得不升级cxf为2.7.18
1.修改maven pom,如下:
<!-- webservice -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>apache-cxf</artifactId>
<version>2.7.18</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-asm</artifactId>
</exclusion>
</exclusions>
<type>pom</type>
</dependency>
因为2.7.18会自动下载spring-asm3.02 jar包,与我环境的spring4.0.2冲突,故添加exclusions来限制自动下载此依赖。
2.修改web.xml,经测试,2.7.18只能使用context-param来加载webservice的spring配置文件ws.xml,如果使用与2.2.3类似放在init-param里是不行的(参照2.2.3),会报找不到cxf这个bean的错误,由于context-param <param-name> 重名的只能在web.xml里配置一个(<param-name>不同命的可以有多个),所以以逗号分隔追加,修改如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/mofeni_ts-context.xml,/WEB-INF/ws.xml</param-value>
</context-param>
3.修改项目的jdk为1.7,重新编译,部署,启动tomcat成功
4.最后附上动态调用的客户端代码,不依赖服务端的api
//不用通过wsdl生成类来调用ws,采用发送soap包的方式,动态调用,很方便
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
public class Test2 {
public static void main(String[] args) {
String xmlInput = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><request><operateType>query</operateType><dbType>sqlserver</dbType><orderBy></orderBy><userId>1</userId> <start>0</start><limit>20</limit><processName></processName></request>";
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
String wsUrl = "http://localhost:8081/services_manager/ws/newService?wsdl";
String method = "runMethod";
Client client = dcf.createClient(wsUrl);
Object[] res = null;
try {
res = client.invoke(method, "560A48A7D9A41BAF80EDF6F9C6A6AF58");
System.out.println(res[0]);
} catch (Exception e) {
e.printStackTrace();
}
System.exit(0);
}
}
5.运行Test2后结果如下: