cxf WebService设置wsdl中soapAction的值

用cxf开发一个WebService很简单,只需要下面几步:

1.定义接口

public interface HelloService {
    String hello();
}

2.实现

public class HelloServiceImpl implements HelloService {
    @Override
    public String hello() {
        return "hi,my name is gyoung ";
    }
}

3.用ServerFactoryBean生成服务

    public static void main(String[] args) {
        HelloServiceImpl helloworldImpl = new HelloServiceImpl();
        //cxf发布服务的工厂bean
        ServerFactoryBean svrFactory = new ServerFactoryBean();
        //设置服务类
        svrFactory.setServiceClass(HelloService.class);
        //设置服务地址
        svrFactory.setAddress("http://localhost:9001/Hello");
        //设置服务bean
        svrFactory.setServiceBean(helloworldImpl);
        svrFactory.create();
    }

这样,一个简单的HelloWorld服务便生成成功了。

但是,这样生成的服务有一个问题,wsdl中的soapAction属性是空的

<wsdl:binding name="HelloServiceSoapBinding" type="tns:HelloServicePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="hello">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="hello">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="helloResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>

这一段<soap:operation soapAction="" style="document"/>,如果是.net生成的服务,soapAction是有值的

<wsdl:binding name="WebService1Soap" type="tns:WebService1Soap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="HelloWorld">
<soap:operation soapAction="http://tempuri.org/HelloWorld" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>

查看了很久的源码,才发现,设置cxf设置soapAction是在org.apache.cxf.wsdl.service.factory.ReflectionServiceFactoryBean类中

它会去循环遍历serviceConfigurations,调用其getAction方法来获取action的值。但初始的serviceConfigurations只有DefaultServiceConfiguration和SoapBindingServiceConfiguration,这两个类都没有实现其基类AbstractServiceConfiguration中的getAction方法。所以getAction返回值是空,所以wsdl中的soapAction值也会是空。找到问题就好办了,我们在serviceConfigurations中增加一个config,在AbstractServiceConfiguration的众多子类中,我发现MethodNameSoapActionServiceConfiguration有继承getAction方法,所以我们只需要在生成服务的时候,增加一个MethodNameSoapActionServiceConfiguration

配置就行了。

  public static void main(String[] args) {
        HelloServiceImpl helloworldImpl = new HelloServiceImpl();
        //cxf发布服务的工厂bean
        ServerFactoryBean svrFactory = new ServerFactoryBean();
        svrFactory.getServiceFactory().getConfigurations().add(new MethodNameSoapActionServiceConfiguration());
        //设置服务类
        svrFactory.setServiceClass(HelloService.class);
        //设置服务地址
        svrFactory.setAddress("http://localhost:9001/Hello");
        //设置服务bean
        svrFactory.setServiceBean(helloworldImpl);
        svrFactory.create();
    }

最张生成的wsdl

<wsdl:binding name="HelloServiceSoapBinding" type="tns:HelloServicePortType">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="hello">
<soap:operation soapAction="hello" style="document"/>
<wsdl:input name="hello">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="helloResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>

当然,我们也可以自己继承AbstractServiceConfiguration来实现getAction方法。

时间: 2024-10-11 07:54:43

cxf WebService设置wsdl中soapAction的值的相关文章

笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDispatcher 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <filter>     <filter-name>struts2</filter-name>     <filter-class>org.apache.struts2.di

Jquery Ajax 异步设置Table中某列的值

可根据table中某列中的ID去改变某列的值! JS: 1 $(document).ready(function () { 2 setTimeout(GetDate, 1000); 3 4 }); 5 6 function GetDate() { 7 $("#tbData tbody").find("tr").each(function () { 8 var prjectBalanceObj = $(this).find("td:eq(3)");

WCF项目问题2-无法激活服务,因为它需要 ASP.NET 兼容性。没有未此应用程序启用 ASP.NET 兼容性。请在 web.config 中启用 ASP.NET 兼容性,或将 AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode 属性设置为 Required 以外的值。

无法激活服务,因为它需要 ASP.NET 兼容性.没有未此应用程序启用 ASP.NET 兼容性.请在 web.config 中启用 ASP.NET 兼容性,或将 AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode 属性设置为 Required 以外的值. 在web.config中添加 aspNetCompatibilityEnabled="true"属性即可,如下: <servi

java 中利用反射机制获取和设置实体类的属性值

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. JAVA反射(放射)机制:"程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言".从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言.但是JAVA有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可

asp.net EF model中的默认值设置

在做数据库规划时,通常会规划一些系统字段,也就是由数据库本身自行指定默认值到这个字段上,创建新的“创建时间(CreateDate)”字段就会常常这样设计. 如果希望能有默认值,且让.net 程序在新增信息到数据库时不用指定的值的话,那么你需要在你的该属性(property)上面加上一个DatabaseGenerated属性(Attribute),并传入DatabbaseGeneratedOption.Computed参数到DatabaseGenerated 属性中. 在调用DatabaseGen

yii2中textarea中的默认值设置

1. view中显示文本域的位置 <?= $form->field($goods_model, 'goods_introduce')->textArea(['class'=>'intr','rows'=>3]) ?> 2.要在该文本域中添加默认值,需要在view中设置,不能使用value="",textarea本身没有value属性设置 $goods_model->goods_introduce='aaa'; 最后,aaa将显示在文本域中作为默

asp.net通过后台代码给前台设置css样式,下拉列表在js中的取值

后台根据不同的用户登陆隐藏或显示前台div标签 前台: 将div声明成服务器端控件 <div id="div1" runat="server">....</div> 后台 隐藏: this.div1.Style.Add("display", "none"); 显示: this.div1.Style.Add("display", "block"); 必须要加 run

Cxf WebService实战

在前一篇转载的关于cxf webservice的实现思路中向大家介绍了实现webservice的思路,但并没有给出具体的实现代码,在本文中我将通过介绍借助于spring实现webservice的方式,在本文中同时将向大家介绍在我实现的过程中遇到的一些问题. 1.搭建webservice服务端: (1.1)新建java web工程,同时在web.xml中进行spring的相关配置,如下: <?xml version="1.0" encoding="UTF-8"?

认识 CXF(WebService框架)

Apache CXF = Celtix + Xfire 支持多种协议: 1)SOAP1.1,1.2 2)HTTP 3)CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构,早期语言使用的WS.C,C++,C#) 4)可以与Spring进行快速无缝的整合 5)灵活的部署:可以运行有Tomcat,Jboss,Jetty(内置),IBMWS,BeaWS上面. 下载地址:http://cxf.apache.org/download.htm