java使用 CXF 开发webservice
2016-01-30 15:07
609 查看
案例源码有需要的可以下载:
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
<dependency>
<groupId>***</groupId>
<artifactId>***</artifactId>
<version>1.0.1</version>
<exclusions>
<exclusion>
<artifactId>xml-apis</artifactId>
<groupId>xml-apis</groupId>
</exclusion>
</exclusions>
</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
plaincopy
<exclusion>
<groupId>stax</groupId>
<artifactId>stax-api</artifactId>
</exclusion>
第三个问题:
java.lang.LinkageError: loader constraint violation:
when resolving overridden method "com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Ljavax/xml/stream/XMLStreamReader;Ljava/lang/Class;)Ljavax/xml/bind/JAXBElement;" the class loader (
instance of weblogic/utils/classloaders/ChangeAwareClassLoader) of the current class,
com/sun/xml/bind/v2/runtime/unmarshaller/UnmarshallerImpl, and its superclass loader (instance of <bootloader>),
have different Class objects for the type allerImpl.unmarshal(Ljavax/xml/stream/XMLStreamReader;Ljava/lang/Class;)Ljavax/xml/bind/JAXBElement;
used in the signature
依旧还是jar包冲突,这次是 javax.xml.stream的stax-api
[html] view
plaincopy
<exclusion>
<groupId>javax.xml.stream</groupId>
<artifactId>stax-api</artifactId>
</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 对应的所有文件.
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
<dependency>
<groupId>***</groupId>
<artifactId>***</artifactId>
<version>1.0.1</version>
<exclusions>
<exclusion>
<artifactId>xml-apis</artifactId>
<groupId>xml-apis</groupId>
</exclusion>
</exclusions>
</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
plaincopy
<exclusion>
<groupId>stax</groupId>
<artifactId>stax-api</artifactId>
</exclusion>
第三个问题:
java.lang.LinkageError: loader constraint violation:
when resolving overridden method "com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Ljavax/xml/stream/XMLStreamReader;Ljava/lang/Class;)Ljavax/xml/bind/JAXBElement;" the class loader (
instance of weblogic/utils/classloaders/ChangeAwareClassLoader) of the current class,
com/sun/xml/bind/v2/runtime/unmarshaller/UnmarshallerImpl, and its superclass loader (instance of <bootloader>),
have different Class objects for the type allerImpl.unmarshal(Ljavax/xml/stream/XMLStreamReader;Ljava/lang/Class;)Ljavax/xml/bind/JAXBElement;
used in the signature
依旧还是jar包冲突,这次是 javax.xml.stream的stax-api
[html] view
plaincopy
<exclusion>
<groupId>javax.xml.stream</groupId>
<artifactId>stax-api</artifactId>
</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 对应的所有文件.
相关文章推荐
- Java中的Clone接口
- springmvc整合dubbo分布式系统的搭建demo
- java的8种基础数据类型
- 【转】JAVA程序中Float和Double精度丢失问题
- MyEclipse的一些设置
- Struts2中Action中指定方法的调用(动态调用)
- Java 并发:Executors 和线程池
- 详解java解压缩zip和rar的工具类使用教程
- JAVA学习第三十六课(经常使用对象API)— Set集合:HashSet集合演示
- BitmapFactory.decodeStream 内存溢出java.lang.OutOfMemoryError
- 详解java解压缩zip和rar的工具类使用教程
- Java字节序
- java ftp 上传 下载 byte[] 多线程
- eclipse birt报表开发入门
- ubuntu下jdk的javac和java
- ubuntu下jdk安装 (转)
- 【转】java中float与byte[]的互转 -- 不错
- 10 points about instanceof operator in Java with example
- java多线程——同步方法和同步代码块
- 2016年最新JAVA/JSP毕业设计题目