您的位置:首页 > 编程语言 > Java开发

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 对应的所有文件.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: