java使用 CXF 开发webservice

8 篇文章 0 订阅
6 篇文章 0 订阅

案例源码有需要的可以下载:

http://download.csdn.net/detail/wangzhiqiang123456/9423090

CXF jar包
http://download.csdn.net/detail/wangzhiqiang123456/9423080

研发需要的包:

asm-3.3.1.jar
commons-collections-3.2.1.jar
commons-lang3-3.1.jar
commons-logging-1.0.4.jar
cxf-core-3.0.7.jar
cxf-rt-bindings-soap-3.0.7.jar
cxf-rt-databinding-jaxb-3.0.7.jar
cxf-rt-frontend-jaxws-3.0.7.jar
cxf-rt-frontend-simple-3.0.7.jar
cxf-rt-transports-http-3.0.7.jar
cxf-rt-wsdl-3.0.7.jar
log4j-1.2.17.jar
neethi-3.0.3.jar
slf4j-api-1.7.9.jar
spring-aop-4.0.6.RELEASE.jar
spring-beans-4.0.6.RELEASE.jar
spring-context-4.0.6.RELEASE.jar
spring-core-4.0.6.RELEASE.jar
spring-expression-4.0.6.RELEASE.jar
spring-web-4.0.6.RELEASE.jar
stax2-api-3.1.4.jar
woodstox-core-asl-4.4.1.jar
wsdl4j-1.6.3.jar
xmlschema-core-2.2.1.jar


下边是配置和案例

1.CXF是结合spring实现的webservice,web.xml 需要配置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">
 <!-- 加载Spring容器配置 -->  
    <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>  
    <!-- 设置Spring容器加载配置文件路径 -->  
    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath*:applicationContext-server.xml</param-value>  
    </context-param>  
  
    <listener>  
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>  
    </listener>  
  
    <servlet>  
        <servlet-name>CXFService</servlet-name>  
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>CXFService</servlet-name>  
        <url-pattern>/*</url-pattern>  
    </servlet-mapping> 
</web-app>



2.spring 主要配置,通过配置可以实现多个接口。使用weblogic或tomcat 来部署webservice

applicationContext-server.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd    
    http://www.springframework.org/schema/context    
    http://www.springframework.org/schema/context/spring-context-3.0.xsd    
    http://cxf.apache.org/jaxws     
    http://cxf.apache.org/schemas/jaxws.xsd">  
    <bean id="inMessageInterceptor" class="org.apache.cxf.interceptor.LoggingInInterceptor"/>  
    <bean id="outLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />  


   <bean id="userServiceBean" class="com.demo.HelloWorldImpl" />  
    <jaxws:server id="userService" serviceClass="com.demo.HelloWorld" address="/Users" >  
        <jaxws:serviceBean>  
            <ref bean="userServiceBean" />  
        </jaxws:serviceBean>  
        <jaxws:inInterceptors>  
            <ref bean="inMessageInterceptor" />  
        </jaxws:inInterceptors>  
        <jaxws:outInterceptors>  
            <ref bean="outLoggingInterceptor" />  
        </jaxws:outInterceptors>  
    </jaxws:server> 
</beans> 

3.下边是两个java类

HelloWorldImpl.java

package com.demo;


import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;




@WebService
@SOAPBinding(style = Style.RPC) 
public class HelloWorldImpl implements HelloWorld  {
    public String sayHi(String text) {
        return "Helloss " + text;
}


}


HelloWorld.java

package com.demo;


import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;


@WebService
@SOAPBinding(style = Style.RPC)  
public interface HelloWorld {
String sayHi(@WebParam(name="text")String text);
   
}


完成以上步骤完成了webservice接口

遇到的问题:

1.在weblogic上部署,当客户端调用接口时报错

org.apache.cxf.binding.soap.SoapFault: Cannot create a secure XMLInputFactory

解决:weblogic.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "">
 <weblogic-web-app>
  <!-- <context-root>/</context-root> -->
  <container-descriptor>
  <index-directory-enabled>true</index-directory-enabled>
  <prefer-web-inf-classes>true</prefer-web-inf-classes>
  </container-descriptor>
</weblogic-web-app> 


还有两个问题:我没有遇到,把问题也贴出来

第一个问题: java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory at javax.xml.parsers.DocumentBuilderFactory

 

jar包冲突导致,网上的资料大都说是xml-apis 冲突,从war包里删除掉xml-apis,这个网址上也说的很清楚

http://forum.spring.io/forum/spring-projects/container/13517-java-lang-classcastexception-weblogic-xml-jaxp-registrydocumentbuilderfactory

我用的是maven管理jar包,上网找了下,http://stackoverflow.com/questions/4925901/classcastexception-while-parsing-xml-with-weblogic

 

因为使用的是公司的框架,刚好公司框架中依赖了这个xml-apis

  1. <dependency>   
  2. <groupId>***</groupId>  
  3. <artifactId>***</artifactId>  
  4. <version>1.0.1</version>  
  5. <exclusions>  
  6.             <exclusion>  
  7.             <artifactId>xml-apis</artifactId>  
  8.             <groupId>xml-apis</groupId>  
  9.             </exclusion>  
  10.         </exclusions>  
  11. </dependency>  

第二个问题:

java.lang.LinkageError: loader constraint violation: loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader)
previously initiated loading for a different type with name "javax/xml/namespace/QName"

 

也是jar包与WebLogic冲突,这次冲突的是stax的 stax-api,

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <exclusion>  
  2.                 <groupId>stax</groupId>  
  3.                 <artifactId>stax-api</artifactId>  
  4.             </exclusion>  

第三个问题:

   java.lang.LinkageError: loader constraint violation: 
   when resolving overridden method &quot;com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal&#40;Ljavax/xml/stream/XMLStreamReader&#59;Ljava/lang/Class&#59;&#41;Ljavax/xml/bind/JAXBElement&#59;&quot; the class loader &#40;
   instance of weblogic/utils/classloaders/ChangeAwareClassLoader&#41; of the current class,
   com/sun/xml/bind/v2/runtime/unmarshaller/UnmarshallerImpl, and its superclass loader &#40;instance of &lt;bootloader&gt;&#41;,
   have different Class objects for the type allerImpl.unmarshal&#40;Ljavax/xml/stream/XMLStreamReader&#59;Ljava/lang/Class&#59;&#41;Ljavax/xml/bind/JAXBElement&#59;
   used in the signature

 

依旧还是jar包冲突,这次是 javax.xml.stream的stax-api

 

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <exclusion>  
  2.                <groupId>javax.xml.stream</groupId>  
  3.                <artifactId>stax-api</artifactId>  
  4.            </exclusion>  

CXF生成客户端

下载后解压,在这里主要是用到解压后的bin目录中的wsdl2java.bat该批处理文件.
 
可以直接进入bin目下,运行wsdl2java,需要注意的他的几个参数
我测试时直接运行的以下命令:
写道
wsdl2java -p com.zzzl.webservice.qidian -d d:\cxfoutput\src -all  http://game.qidian.com/RemoteWebService/IPreventIndulge.asmx?wsdl
参数说明:
 
-p 也就是package 对应java中的包
-d 输入目录,生成.java文件会在该目录,会自动添加-p参数配置的包路径
-client 生成客户端测试web service的代码.
-server 生成服务器启动web  service的代码.
-impl 生成web service的实现代码.
-ant  生成build.xml文件.
-all 生成上面-client -server -impl -ant 对应的所有文件.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值