`
phpxiaoxin
  • 浏览: 251180 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

cxf spring 发布 webservice 供 .net使用

    博客分类:
  • java
阅读更多

cxf 是 xfire 的替代工具。用来发布webservice。官方网站:http://cxf.apache.org/ 关于使用可以参考:

官方:http://cxf.apache.org/docs/writing-a-service-with-spring.html

 

或者: 使用CXF实现webservice发 布+spring

 

或者:XFire的下一代产品CXF的入门(二) - 与Spring的集成

 

文章里使用了不少注解,其实只需要两个甚至一个就足够了。

需要注意的有以下几点问题:

1.需要引入jar包为:cxf-2.3.1.jar neethi-2.0.4.jar wsdl4j-1.6.2.jar XmlSchema-1.4.7.jar xpp3_min-1.1.4c.jar

可能还会以来其他的,大家根据情况自己引入。

 

2.写好了接口和实现,以及方法后,只需要加一个@WebService的接口将接口和实现关联我的如下:

@WebService(endpointInterface = "com.phpxiaoxinl.remote.service.HotelReservationService")
@BindingType(value = SOAPBinding.SOAP12HTTP_BINDING)
public class HotelReservationServiceImpl implements HotelReservationService {
    @Override
    public SearchHotelRS searchHotel(SearchHotelRQ searchHotelRequest) {
        //impl
        return null;
    }
}

 这里用到了@BindingType的注解,将wsdl发布成soap1.2协议(还有soap1.1)。而1.2与1.1的区别可以通过wsdl看出来:其中1.2会有:

xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"
或者
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 

而如果去掉这个注解其协议将默认为1.1.

 

还有一个问题,你会发现我使用的是searchHotelRQ,searchHotelRS ,而不是 searchHotelRequest,searchHotelReponse 原因是我没有加注解,而cxf生成wsdl的时候有命名空间会自动加request或者是reponse,这样方法名和输入输出很可能造成相同的命名空间(因为这个我调试到半夜2点...),所以大家最好不要将输入和输出带上request或者reponse,否则就最好将searchHotel的方法名改成其他的。

 

3.数据绑定问题。

.net调用时候,vs可以自动生成对象,但是默认会生成一个字段名+Specified的字段,原因细节参考:

http://it.chinawin.net/softwaredev/article-13328.html

这个问题我不十分清楚其原因,估计是因为数据转换的问题。这个可以通过aegis来解决。具体配置参考如下:

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jaxws="http://cxf.apache.org/jaxws"
       xsi:schemaLocation="
	        http://www.springframework.org/schema/beans
	        http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
	        http://cxf.apache.org/jaxws
	        http://cxf.apache.org/schemas/jaxws.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

    <!-- 发布服务  -->
    <bean id="hotelB2CReservationService" class="com.phpxiaoxin.service.HotelReservationServiceImpl">
        <property name="bookingHotelService" ref="bookingHotelService"/>
    </bean>
    <jaxws:endpoint id="hotelReservation" implementor="#hotelReservationService"
        address="/hotelReservation">
        <jaxws:serviceFactory>
           <ref bean='jaxws-and-aegis-service-factory' />
          </jaxws:serviceFactory>
    </jaxws:endpoint>

<bean id="aegisBean" class="org.apache.cxf.aegis.databinding.AegisDatabinding" scope="prototype"/>
 <bean id="jaxws-and-aegis-service-factory"
    class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"
    scope="prototype">
        <property name="dataBinding" ref="aegisBean"/>
 </bean>

</beans>
 

也可参考cxf官方的文档:

http://cxf.apache.org/docs/aegis-databinding-20x.html

 

这样生成的wsdl就会由:

<xs:element minOccurs="0" name="branchId" type="xs:long"></xs:element>

 成为:

 

<xsd:element minOccurs="0" name="branchId" nillable="true" type="xsd:long"></xsd:element>

 

切换之后我遇到的第一个问题就是:

java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"

查了一下是因为jar包的原因。 解析xml的jar:xercesImpl-2.9.1.jar 要用2.9.1以上的。可以参考:

https://jira.kuali.org/browse/KULRICE-2810

 

第二个是.net调用的时候报错:

原因是.net调用的时候设置了压缩xml的参数:DecompressionEnabled = true

参考:HttpTransportBindingElement. DecompressionEnabled

就这些吧。

 

另外我遇到的问题就是,由于我使用了weblogic作为服务器,而.net调用的时候出现如下错误:

Unsupported encoding: "utf-8; action=""" specified.
java.io.UnsupportedEncodingException: Unsupported Encoding utf-8; action=""
        at weblogic.servlet.internal.ServletRequestImpl.setCharacterEncoding(ServletRequestImpl.java:428)

错误原因是因为.net使用了soap1.2协议,生成的header为:

Headers: {content-type=[application/soap+xml; charset=utf-8; action=""]

 

而soap1.1则生成如下的header:

Headers: {content-type=[text/xml; charset=UTF-8], SOAPAction=[""]

 

weblogic解析的时候出了bug,没有将utf-8后面的内容截掉,导致这个错误。所以可以设置成soap1.1来调用。具体.net的设置可以在文档中查找soap,找到相关的配置,设置到配置文件中,也可以参考下面的地址

参考:http://www.coderanch.com/t/224524/Web-Services/java/SOAPAction-header

 

如果是cxf来调用其他人提供的webservice,在已经有wsdl的情况下,可以参考这个文章来完成:

http://blogold.chinaunix.net/u2/73798/showart_2002108.html

主要就是通过cxf提供的工具,通过命令行来生成java对象:

wsdl2java -d src -client http://localhost:8080/webservice/hotelB?wsdl

 

这篇文章也不错:

http://enna.blog.163.com/blog/static/2058701120093242346371/

分享到:
评论

相关推荐

    webservice cxf 整合spring例子源代码

    4. **发布Web服务**:在Spring配置完成后,可以通过Spring启动CXF的Bus,使Web服务自动发布到指定的地址。这通常通过`&lt;jaxws:endpoint&gt;`标签的`address`属性完成。 5. **客户端调用**:在Spring环境中,也可以方便...

    SpringBoot+Mybatis+CXF框架,实现Restful api与 WebService api接口的大实验

    3. 接下来,我们需要实现Restful API和WebService API接口,使用Spring Boot的Restful API和CXF框架来实现学生信息的增删改查操作。 4. 最后,我们需要测试Restful API和WebService API接口,确保其正常工作。 结论...

    spring整合cxf发布webservice实例

    将下载的demo(包括serviceserverdemo及serviceclientdemo,bat文件在serviceclientdemo的src下)导入eclipse即可运行使用,编译时可能需要修改jdk版本,如果导入有错,可新建web项目,按所下载demo的结构搭建即可,...

    cxf实现webservice 多种方式

    cxf实现soap webservice服务,服务端\客户端均与spring结合使用,多种方式实现,花了三天时间弄懂,还有许多不懂的地方,欢迎大家交流.参考我的博文:http://blog.csdn.net/qq_33764491/article/details/78831010

    java调用.net发布的webservice(asmx)

    本文将详细讲解如何使用Java调用.NET发布的Web Service(ASMX),并解决在此过程中可能出现的SOAPAction报错和“Server not identified”错误。 首先,我们需要了解ASMX。ASMX是.NET Framework早期版本中用于创建...

    基于SSM+CXF构建的RESTFul webservice

    使用cxf、spring构建的rest风格webservice,其他相关技术springmvc、mybatis、druid等。代码中使用的数据库为sybase,请根据实际环境更改,需修改pom中引用的数据库驱动,依照entity类的属性建对应表,并修改config....

    Spring+cxf=webservice 的jar包1

    【Spring+cxf=WebService】是将Spring框架与Apache CXF集成来实现Web服务的一种常见方式。Spring是一个强大的Java企业级应用开发框架,它提供了一种模块化和灵活的方式来组织和管理应用程序的组件。而CXF则是一个...

    ibatis+spring+cxf+mysql搭建webservice的客户端

    ibatis+spring+cxf+mysql搭建webservice的客户端,文章地址在http://blog.csdn.net/cenyi2013/article/details/17315755. 服务端源码的下载地址在http://download.csdn.net/detail/cenyi2012/6712729

    webservice之Spring整合CXF

    WebService小白学习 之 Spring整合CXF,添加拦截器。 博客学习地址:https://blog.csdn.net/qq_37902949/article/details/81262826

    CXF+Spring+自定义拦截器 WebService实例源码下载

    这里少了一个类,是根据实体类生成xml的文件下载地址为:http://download.csdn.net/detail/qq_14996421/9495688

    cxf实现webservice的项目实例

    5. **服务发布**:使用CXF的工具,如JAX-WS或JAX-RS,可以自动将你的Java类转换为Web服务。你需要在你的服务类上添加适当的注解,如`@WebService`,然后在Spring配置文件中配置服务端点。 6. **部署与测试**:在...

    struts2+spring3+hibernate4+cxf2.7搭建webservice实例

    是eclipse导出的war文件,包含了资源。开发环境jdk1.7 tomcat7。 通过了测试,对应的文档:http://blog.csdn.net/biboheart/article/details/9148651, 有文档了,这里就不多说了。

    maven3.04+spring3.2.8+cxf2.7.12+tomcat7实现RESTFul风格的webservice服务

    自己在网上找了很多cxf实现rest风格...现在把源码发上来,java代码只有12K,主要是lib里面的全部jar包(spring、cxf等全部的jar包), 文章地址:http://blog.csdn.net/lxn39830435731415926/article/details/39448887

    mybatis+spring3+mysql整合的webservice的service

    【标题】"mybatis+spring3+mysql整合的webservice的service"涉及到的是将MyBatis、Spring3和MySQL数据库集成在一起,构建一个基于CXF框架的Web服务。这是一个常见的企业级应用架构,用于实现数据持久化、业务逻辑...

    使用CXF+spring创建一个web的接口项目源代码

    使用CXF+spring创建一个web的接口项目源代码,Myeclipse创建,部署到tomcat中即可访问。 与此对应的博客地址为:http://blog.csdn.net/zxnlmj/article/details/28880303

    webservice注解修改生成wsdl信息

    - **基本认证**:通过`@WebService`上的`endpointInterface`属性,结合Spring Security等安全框架实现。 - **消息级安全**:使用WS-Security规范,例如WS-UsernameToken,WS-SecureConversation等。 - **SSL/TLS*...

    CXF集成Spring示例_附源码

    自己总结的一个CXF集成Spring的例子,可以直接运行,附源码! 程序的详细说明请参照博客文档 http://blog.csdn.net/sunbaojin5213344/article/details/8931600

    CXF所有资源包,WebService轻松上手

    7. **IFIRE**:IFIRE是CXF的一个子项目,专注于提供基于.NET的Web服务客户端支持,使得Java应用可以方便地调用.NET平台上的Web服务。 在使用CXF 2.4.10资源包时,你需要按照以下步骤操作: 1. **下载和解压**:...

    cxf3.0 spirng 集成笔记

    第二个想法是让CXF独立运行,并通过自定义桥接方法从Spring容器获取Bean并发布服务。作者尝试扩展`org.apache.cxf.transport.servlet.CXFNonSpringServlet`来配置CXF启动器,但遇到了一个问题:CXF依赖于Spring的一...

Global site tag (gtag.js) - Google Analytics