maven3.5.2+Spring4.2.5+CXF3.1.5遇到的问题
善意提示:
spring4.0 不支持xfire1.2.6
Spring3.2.x、Spring3.0.x及Spring2.0.x支持xfire1.2.6(至此该框架不再更新)
问题介绍:
本项目采用的是maven3.5.2+Spring4.2.5+CXF3.1.5版本来开发的WS服务,项目中有定时任务,和调用其他系统WS服务(本系统提供客服端服务)的功能。
问题主要集中在在调用其他系统WS服务的功能上,所以在此也集中展示此功能问题的实例:本地调用时可以的但是部署到Weblogic10.3.6就包如下错误。
pom.xml文件内容
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>aaa</groupId>
<artifactId>aaa</artifactId>
<packaging>war</packaging>
<version>0.1.0-SNAPSHOT</version>
<name>seacis Maven Webapp</name>
<url>http://maven.apache.org</url>
<!--************定义属性************ -->
<properties>
<!-- 定义编码格式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 定义软件版本 -->
<dom4j.version>1.6.1</dom4j.version>
<cxf.version>3.1.5</cxf.version>
<spring.version>4.2.5.RELEASE</spring.version>
<quartz.version>2.2.2</quartz.version>
</properties>
<!--************定义依赖************ -->
<dependencies>
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>woodstox-core-asl</artifactId>
<version>4.4.1</version>
</dependency>
<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>stax2-api</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.3</version>
</dependency>
<!-- 测试相关 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- XML解析制作相关 -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>${dom4j.version}</version>
</dependency>
<!-- 日志相关 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- 定时任务 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>${quartz.version}</version>
</dependency>
<!-- CXF相关 (根据下方官方文档添加) -->
<!-- http://cxf.apache.org/docs/using-cxf-with- maven.html -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- Jetty is needed if you're are not using the CXFServlet-->
<!-- 不用JETTY可以删除下面 -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>${cxf.version}</version>
</dependency>
<!-- Spring相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Aspect -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
<!-- 数据库驱动相关 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<!-- REDIS集群相关 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
<build>
<finalName>aaa</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler- plugin</artifactId>
<version>3.3</version>
<configuration>
<!-- 指定source和target的JDK版本 -->
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
调用其他系统的本地客户端代码:
调用方式1:
使用JaxWsDynamicClientFactory对象实现调用,使用该对象只要指定服务器端wsdl文件的位置,然后指定要调用的方法和方法的参数即可,
优点:不关心服务端的实现方式。
代码如下:
JaxWsDynamicClientFactory factory= JaxWsDynamicClientFactory.newInstance();
Client client = factory.createClient(wsdlUrl);
logger.debug("成功生成调用对端服务的客户端对象:" + client.toString());
//参数1:名称空间;参数2:要调用服务的方法名
QName qName = new QName(nameSpace, methodName);
Object[] respResult = client.invoke(qName, reqXml);
result = respResult[0].toString();
报错1. org.apache.cxf.binding.soap.SoapFault:Cannot create a secure XMLInputFactory
解决:在WEB-INF文件夹下,加上weblogic.xml,内容如下:
<?xmlversion="1.0" encoding="UTF-8" ?>
<weblogic-web-appxmlns="http://www.bea.com/ns/weblogic/weblogic-web-app"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-apphttp://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd">
<container-descriptor>
<index-directory-enabled>true</index-directory-enabled>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
</weblogic-web-app>
意思是:有限使用Web项目中的jar包。
使用JaxWsProxyFactoryBean对象实现调用,使用该对象是在客户服务直接访问服务端在本地生成的代理对象及接口(前提:使用wsdl2java命令生成服务端的本地代理类),间接的实现对远程WS服务的调用。
缺点:a. 客户端必须依赖服务器端的接口(即在本地生成代理类(桩))
b. 要求服务器端的webservice必须是java实现。
代码如下:
JaxWsProxyFactoryBean proxyBean = newJaxWsProxyFactoryBean();
proxyBean.setAddress(wsdlUrl);
// 参数1:生成的本地代理桩接口
JiBeiCJCB clientImpl = proxyBean.create(JiBeiCJCB.class);
String resultData = clientImpl.noticeCJCBTASK(reqXml);
报错1:java.long.ClasscastException:weblogic.xml.jaxp.RegistryDocumentBuliderFactory cannot be cast tojavax.xml parsers. yDocumentBuliderFactory
解决:war里缺少了wsdl4j.jar包。
报错2:java.long.IllegalArgumentException: Argument(s) “type”can’t be null
解决:删除WEB-INF/lib下的jaxb-api-2.2.3-2.5.2.jar、jaxb-impl-2.2.4-2.5.2.jar、jaxb-xjc-2.2.4-2.5.2.jar、
我的项目里只有一个jaxb-impl-2.2.11jar,那就只删除他,问题成功解决。