• cxf WebService设置wsdl中soapAction的值


    原文地址:https://www.cnblogs.com/Gyoung/p/5469536.html

    用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方法。

    如果我的文章对你有帮助,就点一下推荐吧.(*^__^*)
  • 相关阅读:
    面向对象简述
    python面向对象
    Python中int()函数的用法浅析
    给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
    python中关于round函数的小坑
    Xmind8破解,以及相关的流程和破解包
    生成器和生成器表达式
    brush图标
    js声明全局变量的方式
    js修改全局变量
  • 原文地址:https://www.cnblogs.com/mkl34367803/p/8425063.html
Copyright © 2020-2023  润新知