cxf和axis2整合

java创建webservice接口
1 用jdk自带的jws
2 webserivce框架

目前java开发webservice的框架是cxf和axis2。cxf继承了jws的API。和spring可以无缝结合。还可以用js调用。
axis2 支持java,c++语言开发webserive,有自己的数据绑定方式adb.不过本人并不喜欢用axis2去开发webserive。官方给的实例实用性不高,要打包aar文件。依赖axis2的中间容器。当然你也可以不打包aar.不过官方没给出,这个需要自己摸索。
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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>XX</groupId>
  <artifactId>XX</artifactId>
  <version>1.0</version>
  <packaging>war</packaging>
  <properties>
  <spring.version>3.0.5.RELEASE</spring.version>
  <axis2.version>1.6.2</axis2.version>
  <java.home>C:\Program Files\Java\jdk1.6.0_43</java.home> 
  </properties>
  
   <!--   <profiles>
    <profile>
      <id>default-tools.jar</id>
      <activation>
        <property>
          <name>java.vendor</name>
          <value>Sun Microsystems Inc.</value>
        </property>
      </activation>
      <dependencies>
        <dependency>
          <groupId>com.sun</groupId>
          <artifactId>tools</artifactId>
          <version>1.6.0_43</version>
          <scope>system</scope>
          <systemPath>${java.home}/lib/tools.jar</systemPath>
        </dependency>
      </dependencies>
    </profile>
  </profiles>
  -->
     <build>
     
      <!-- <finalName>NPS-Web-${project.version}.build.${maven.build.timestamp}</finalName> -->
		<defaultGoal>jetty:run</defaultGoal>
		<resources>
			<resource>
				<filtering>true</filtering>
				<directory>src/main/resources</directory>
			</resource>
			<resource>
				<filtering>true</filtering>
				<directory>src/test/resources</directory>
			</resource>
		</resources>
		
        <plugins>
        
	        <plugin>
	       <groupId>org.apache.maven.plugins</groupId>
	       <artifactId>maven-resources-plugin</artifactId>
	       <configuration>
	              <encoding>UTF-8</encoding>
	       </configuration>
			</plugin>
        	<plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.5.1</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
              </plugin>
              
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.1</version>
 
                <configuration>
                    <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
                </configuration>
            </plugin>
            
            <plugin>
				<groupId>org.mortbay.jetty</groupId>
				<artifactId>jetty-maven-plugin</artifactId>
				<version>8.1.8.v20121106</version>
				<configuration>
					<webAppConfig>
						<defaultsDescriptor>src/test/resources/webdefault.xml</defaultsDescriptor>
						<contextPath>/RecoverGroup</contextPath>
					</webAppConfig>
				</configuration>
			</plugin>
        </plugins>
    </build>
    
  <dependencies>
  <!--s- spring jar -->
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>${spring.version}</version>
  </dependency>
  
   <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aspects</artifactId>
  <version>${spring.version}</version>
  </dependency>
  
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-aop</artifactId>
  <version>${spring.version}</version>
  </dependency>
  
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-orm</artifactId>
  <version>${spring.version}</version>
  </dependency>
  
  
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-expression</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-test</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-context</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-beans</artifactId>
  <version>${spring.version}</version>
  </dependency>
  
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-asm</artifactId>
  <version>${spring.version}</version>
  </dependency>
  
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-oxm</artifactId>
  <version>${spring.version}</version>
  </dependency>
  
  <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>${spring.version}</version>
  </dependency>
  <!--e- spring jar -->
  <!--s- hibernate jar -->
  <dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate</artifactId>
  <version>3.3.2</version>
  </dependency>
   <dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-annotations</artifactId>
  <version>3.3.1.GA</version>
  </dependency>
   <dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-commons-annotations</artifactId>
  <version>3.2.0.Final</version>
  </dependency>
   <dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>3.3.2.GA</version>
  </dependency>
  <!--  
   <dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-ehcache</artifactId>
  <version>3.3.2.GA</version>
  </dependency>
  -->
   <dependency>
  <groupId>org.hibernate.javax.persistence</groupId>
  <artifactId>hibernate-jpa-2.0-api</artifactId>
  <version>1.0.1.Final</version>
  
  </dependency>
  
  <dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>3.1.0.GA</version>
  
  </dependency>
  <dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>ejb3-persistence</artifactId>
  <version>1.0.2.GA</version>
  
  </dependency>
 
  <!--e- hibernate jar -->
   <dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-beanutils</artifactId>
  <version>1.8.0</version>
  </dependency>
   <dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-logging</artifactId>
  <version>1.1.1</version>
  </dependency>
  <!--  -->
   <dependency>
  <groupId>org.apache</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.15</version>
  </dependency>
  <!-- aspectj 切面编程-->
  <dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjweaver</artifactId>
  <version>1.6.8</version>
  </dependency>
  <dependency>
  <groupId>org.aspectj</groupId>
  <artifactId>aspectjrt</artifactId>
  <version>1.6.8</version>
  </dependency>
  
  <dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-dbcp</artifactId>
  <version>1.2.1</version>
  </dependency>
  
  <dependency>
  	<groupId>org.apache.commons</groupId>
  	<artifactId>commons.pool</artifactId>
  	<version>1.5.3</version>
  </dependency>
  <dependency>
  	<groupId>org.slf4j</groupId>
  	<artifactId>slf4j-api</artifactId>
  	<version>1.5.8</version>
  </dependency>
  <dependency>
  	<groupId>org.javassist</groupId>
  	<artifactId>javassist</artifactId>
  	<version>3.15.0-GA</version>
  </dependency>
  <!-- s-junit -->
  
  <dependency>
  	<groupId>org.junit</groupId>
  	<artifactId>junit</artifactId>
  	<version>4.8.1</version>
  	<scope>test</scope>
  </dependency>
  <dependency>
  	<groupId>org.hamcrest</groupId>
  	<artifactId>hamcrest-all</artifactId>
  	<version>1.2</version>
  	<scope>test</scope>
  </dependency>
   <!--e-junit-->
    <!--s-struts2 -->
  <dependency>
  	<groupId>org.apache.struts</groupId>
  	<artifactId>struts2-core</artifactId>
  	<version>2.1.8.1</version>
  </dependency>
  <dependency>
  	<groupId>org.apache.struts</groupId>
  	<artifactId>struts2-spring-plugin</artifactId>
  	<version>2.1.8.1</version>
  </dependency>
  <dependency>
  	<groupId>javax.servlet</groupId>
  	<artifactId>servlet-api</artifactId>
  	<version>2.5</version>
  </dependency>
  <dependency>
  	<groupId>org.apache.struts</groupId>
  	<artifactId>struts-taglib</artifactId>
  	<version>1.3.8</version>
  </dependency>
  <dependency>
  	<groupId>org.apache.struts</groupId>
  	<artifactId>struts2-convention-plugin</artifactId>
  	<version>2.1.8.1</version>
  </dependency>
  <dependency>
  <groupId>org.apache.struts</groupId>
  	<artifactId>struts2-json-plugin</artifactId>
  	<version>2.1.8.1</version>
  </dependency>
  <!--e-struts2 -->
  
  <!-- s-cxf -->
  <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.5.8</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>2.7.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>2.7.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>2.7.8</version>
        </dependency>
       <!-- e-cxf -->
        <dependency>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-webapp</artifactId>
            <version>8.1.14.v20131031</version>
        </dependency>
                
    <dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.0.4</version>
</dependency>



   <dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib-nodep</artifactId>
  <version>2.2.2</version>
	</dependency>
	<!-- 
	    <dependency>
	  <groupId>org.apache.ws.security</groupId>
	  <artifactId>wss4j</artifactId>
	  <version>1.6.13</version>
	</dependency>
	 -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-ws-rm</artifactId>
            <version>2.7.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-ws-security</artifactId>
            <version>2.7.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-ws-addr</artifactId>
            <version>2.7.8</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-ws-policy</artifactId>
            <version>2.7.8</version>
        </dependency>
        	
        
        
       <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.5.8</version>
        </dependency>
        
<dependency>
	<groupId>org.codehaus.woodstox</groupId>
	<artifactId>woodstox-core-asl</artifactId>
	<version>4.2.0</version>
</dependency>


<dependency>
	<groupId>org.codehaus.woodstox</groupId>
	<artifactId>stax2-api</artifactId>
	<version>3.0.1</version>
</dependency>
       
        
    <!-- <dependency>
  <groupId>nl.pinkroccade.quarant</groupId>
  <artifactId>quarant-domain-model</artifactId>
  <version>1.0.0</version>
</dependency>-->
        
       <dependency>
       	<groupId>com.oracle</groupId>
       	<artifactId>ojdbc14</artifactId>
       	<version>10.2.0.4.0</version>
       </dependency>
       
       <!-- axis2-->
       
       <dependency>
       	<groupId>org.apache.axis2</groupId>
       	<artifactId>axis2-adb</artifactId>
       	<version>${axis2.version}</version>
       </dependency>
       
       <dependency>
       	<groupId>org.apache.axis2</groupId>
       	<artifactId>axis2-adb-codegen</artifactId>
       	<version>${axis2.version}</version>
		<exclusions>
			<exclusion>
			<artifactId>org.apache.ws.commons.schema</artifactId>
			<groupId>XmlSchema</groupId>
			</exclusion>
		</exclusions>
       </dependency>
       
       <dependency>
       	<groupId>org.apache.axis2</groupId>
       	<artifactId>axis2-java2wsdl</artifactId>
       	<version>${axis2.version}</version>
       	<exclusions>
			<exclusion>
			<artifactId>org.apache.ws.commons.schema</artifactId>
			<groupId>XmlSchema</groupId>
			</exclusion>
		</exclusions>
       </dependency>
       
       <dependency>
       	<groupId>org.apache.axis2</groupId>
       	<artifactId>axis2-jaxws</artifactId>
       	<version>${axis2.version}</version>
       </dependency>
       <dependency>
       	<groupId>org.apache.axis2</groupId>
       	<artifactId>axis2-kernel</artifactId>
       	<version>${axis2.version}</version>
       	<exclusions>
			<exclusion>
			<artifactId>org.apache.ws.commons.schema</artifactId>
			<groupId>XmlSchema</groupId>
			</exclusion>
		</exclusions>
       </dependency>
       
       <dependency>
       	<groupId>org.apache.axis2</groupId>
       	<artifactId>axis2-saaj</artifactId>
       	<version>${axis2.version}</version>
       </dependency>
       
      <dependency>
       	<groupId>org.apache.axis2</groupId>
       	<artifactId>axis2-transport-http</artifactId>
       	<version>${axis2.version}</version>
       </dependency>
       <dependency>
       	<groupId>org.apache.axis2</groupId>
       	<artifactId>axis2-transport-local</artifactId>
       	<version>${axis2.version}</version>
       </dependency>
       
    <dependency>
	<groupId>org.apache.ws.commons.axiom</groupId>
	<artifactId>axiom-api</artifactId>
	<version>1.2.13</version>
</dependency>
        <dependency>
	<groupId>org.apache.ws.commons.axiom</groupId>
	<artifactId>axiom-impl</artifactId>
	<version>1.2.13</version>
</dependency>      
      <dependency>
	<groupId>javax.activation</groupId>
	<artifactId>activation</artifactId>
	<version>1.1</version>
</dependency>

 <dependency>
	<groupId>commons-codec</groupId>
	<artifactId>commons-codec</artifactId>
	<version>1.3</version>
</dependency>


<dependency>
	<groupId>commons-httpclient</groupId>
	<artifactId>commons-httpclient</artifactId>
	<version>3.1</version>
</dependency>

 <dependency>
	<groupId>org.apache.geronimo.specs</groupId>
	<artifactId>geronimo-stax-api_1.0_spec</artifactId>
	<version>1.0.1</version>
</dependency>

 
<dependency>
	<groupId>org.apache.neethi</groupId>
	<artifactId>neethi</artifactId>
	<version>3.0.2</version>
</dependency>
            
 <dependency>
	<groupId>wsdl4j</groupId>
	<artifactId>wsdl4j</artifactId>
	<version>1.6.2</version>
</dependency>
   

<dependency>
	<groupId>org.codehaus.woodstox</groupId>
	<artifactId>wstx-asl</artifactId>
	<version>3.2.9</version>
</dependency>
    
 <dependency>
 	<groupId>org.quartz-scheduler</groupId>
 	<artifactId>quartz</artifactId>
 	<version>1.7.2</version>
 </dependency>

 <!-- servlet -->
 <dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>servlet-api</artifactId>
	<version>2.5</version>
</dependency>
  </dependencies>
</project>


遇到问题
使用cxf ws-security 安全认证
org.apache.axiom.soap.impl.dom.SOAPEnvelopeImpl cannot be cast to javax.xml.soap.SOAPElement
对其错误进行了debug
创建MessageFactory这个地方问题
 public static MessageFactory createMessageFactory(SoapVersion version) throws SOAPException {
        MessageFactory messageFactory;
        String messageFactoryClassName = SystemPropertyAction.getPropertyOrNull(MESSAGE_FACTORY_KEY);
        if (messageFactoryClassName != null) {
            messageFactory = newInstanceCxfSAAJFactory(messageFactoryClassName,
                                                          MessageFactory.class);
        } else if (version instanceof Soap11) {
            try {
                messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
            } catch (Throwable t) {
                messageFactory = MessageFactory.newInstance();
            }
        } else if (version instanceof Soap12) {
            try {
                messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
            } catch (Throwable t) {
                messageFactory = MessageFactory.newInstance();
            }
        } else {
            messageFactory = MessageFactory.newInstance();
        }
        return messageFactory;
    }

    public static SOAPFactory createSOAPFactory(SoapVersion version) throws SOAPException {
        SOAPFactory soapFactory;
        String soapFactoryClassName = SystemPropertyAction.getPropertyOrNull(SOAP_FACTORY_KEY);
        if (soapFactoryClassName != null) {
            soapFactory = newInstanceCxfSAAJFactory(soapFactoryClassName,
                                                       SOAPFactory.class);
        } else if (version instanceof Soap11) {
            try {
                soapFactory = SOAPFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL);
            } catch (Throwable t) {
                soapFactory = SOAPFactory.newInstance();
            }
        } else if (version instanceof Soap12) {
            try {
                soapFactory = SOAPFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);
            } catch (Throwable t) {
                soapFactory = SOAPFactory.newInstance();
            }
        } else {
            soapFactory = SOAPFactory.newInstance();
        }
        return soapFactory;
    }

创建MessageFactory,有点象jdbc连接。对外提供接口,具体的实现就留给厂家去实现。
现在这里的问题是 厂家有多个,而MessageFactory如果找到了第一个厂家就不会去找第二个。
仔细查看了代码。
cxf 提供使用自己的messageFactoryClassName
  if (messageFactoryClassName != null) {
            messageFactory = newInstanceCxfSAAJFactory(messageFactoryClassName,
                                                          MessageFactory.class);
        }

解决问题是关键
MessageFactory.class

我们可以自己去系统设置 MessageFactory 实体的实例化类

System.setProperty("org.apache.cxf.binding.soap.messageFactoryClassName","com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");

现在有一个问题是是服务端怎么去实现系统设置?
因为服务端的安全认证是配置在spring中。
可以用拦截器去实现

package com.telecommunications.interceptor;

import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;

public class CxfSystemEnvIntercepter extends AbstractPhaseInterceptor<Message>{


	public CxfSystemEnvIntercepter(String phase) {
		
		super(phase);
		
	}
	
	public CxfSystemEnvIntercepter(){
		super(Phase.RECEIVE);
		//System.setProperty("org.apache.cxf.binding.soap.messageFactoryClassName","com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");
		
	}
		
	@Override
	public void handleMessage(Message message) throws Fault {
		// TODO Auto-generated method stub
		if(null==System.getProperty("org.apache.cxf.binding.soap.messageFactoryClassName")||"".equals(System.getProperty("org.apache.cxf.binding.soap.messageFactoryClassName"))){
			
			System.setProperty("org.apache.cxf.binding.soap.messageFactoryClassName","com.sun.xml.internal.messaging.saaj.soap.ver1_1.SOAPMessageFactory1_1Impl");
		}
	
		
	}

	

}

Spring.xml

 <jaxws:inInterceptors> 
            <ref bean="loggingInInterceptor"/>
             
            <bean class="com.telecommunications.interceptor.CxfSystemEnvIntercepter"></bean>
             
              
            	 <bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />  
            	 <bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">  
                 <constructor-arg>  
                    <map>  
                        <entry key="action" value="UsernameToken" />  
                        <entry key="passwordType"  
                            value="PasswordText" />  
                        <entry key="user" value="EDA" />  
                        <entry key="passwordCallbackRef">  
                            <ref bean="serverAutherHandler" />  
                        </entry>  
                    </map>  
                </constructor-arg>  
            </bean> 
           
           
          </jaxws:inInterceptors> 


jar冲突

axis2
<artifactId>org.apache.ws.commons.schema</artifactId>
<groupId>XmlSchema</groupId>
<version>1.4.7</version>
cxf
xmlschema-core-2.0.3

删除 axis2的xmlschema的jar

你可能感兴趣的:(CXF,axis2,cfx和axis2整合,cfx和axis2问题)