使用 xfire + spring 实现 web service

文章目录

    Spring 配置

    web.xml

    <context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>
    		classpath:org/codehaus/xfire/spring/xfire.xml
    		/WEB-INF/applicationContext.xml
    	</param-value>
    </context-param> 
    
    <listener>
    	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    
    <!-- Xfire Web Service -->
    <servlet>
        <servlet-name>XFireServlet</servlet-name>
        <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>XFireServlet</servlet-name>
        <url-pattern>/servlet/XFireServlet/*</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>XFireServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
    

    Java Resources - src - META-INF - xfire - services.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <beans xmlns="http://xfire.codehaus.org/config/1.0">
        <service>
            <name>myService</name>
            <serviceClass>com.sunzhongwei.controller.XfireServiceController</serviceClass>
        </service>
    </beans>
    

    实现

    package com.sunzhongwei.controller;
    
    import javax.jws.WebMethod;
    import javax.jws.WebResult;
    import javax.jws.WebService;
    import org.codehaus.xfire.MessageContext;
    
    @WebService
    public class XfireServiceController {
        @WebMethod(operationName = "sayHi", action = "urn:sayHi")
        @WebResult(name = "myAnswer")
        public String sayHi(MessageContext ctx)
        {
           return "Hello world!";
        }
    }
    

    参数说明

    WebService
    - name: web service name, 如果在 services.xml 中配置了 service name, 这里就不需要配置啦。等同于 wsdl 文件中的 wsdl:portType
    - targetNamespace
    - serviceName: 等同于 wsdl 文件中的 wsdl:service
    - wsdlLocation
    - endpointInterface

    WebMethod
    - operationName: 如果不指定,则取方法名为 operation name。建议不填,保持与方法同名。
    - action

    WebParam
    operation 输入参数的映射关系,同样用于生成 wsdl 文件中的 elements。
    - name
    - targetNamespace
    - mode
    - header

    portType 的作用

    <portType name="Hello_PortType">
       <operation name="sayHello">
          <input message="tns:SayHelloRequest"/>
          <output message="tns:SayHelloResponse"/>
       </operation>
    </portType>
    

    可以认为 portType 是用来声明哪几个 request, response 消息属于同一个接口的。只要前缀一致,就能被自动划分到同一个 operation 下,当然前提是必须属于同一个 portType。

    a portType can combine one request and one response message into a single request/response operation. This is most commonly used in SOAP services. A portType can define multiple operations.

    参考 WSDL portType Element

    JWS

    Java Web Service

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式