通过Axis2发布WebService服务端

1.配置web.xml

    在web,xml中需要加入如下代码:

<!--Axis2 config start -->
    <servlet>
        <servlet-name>AxisServlet</servlet-name>
        <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
<!--Axis2 end -->

   其中<servlet-name>与<url-pattern>可以根据需要自行配置。

2.服务部署

   Axis2使用service.xml来部署服务,具体步骤如下:

   首先,需要在WEB-INF下的service文件夹中新建文件用于部署服务,名称自取。

   其次在该文件下新建文件夹META-INF用于存放部署文件。

   最后,在META-INF中新建service.xml文件,该文件用于服务的部署。

  文档结构如图所示

 

  3.配置service.xml文件

  整个service.xml文档结构类似如下:

<?xml version="1.0" encoding="UTF-8"?>
<service name="TestServer" targetNamespace="http://ws.apache.org/axis2">
	<description>测试接口服务</description>
	<schema schemaNamespace="http://ws.apache.org/axis2" elementFormDefaultQualified="false"/>
	<parameter name="ServiceClass">
                com.test.TestServer
	</parameter>
	<operation name="isAlive">
		<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
	</operation>
	<operation name="getIpSubNet">
		<messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
	</operation>	
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
			class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
		<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
			class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
	</messageReceivers>
</service>  

    3.1部署单个服务

    部署单个服务使用<service>标签。

    name属性指明该服务的名称,若不指定,则默认使用该服务在Axis中的包名作为服务名。

    targetNamespace属性指明该服务的命名空间,服务目标名字空间仅仅在WSDL生成过程中起作用。在运行时,如果有人试图使用?wsdl来查看WSDL,那么生成的WSDL文件中的目标名字空间就是services.xml文件中指定的值。同时,我们为了使用自定义的WSDL文件,把WSDL文件放到META-INF目录中,这种情况下要覆盖原有的目标名字空间,也是通过往services.xml文件中添加目标名字空间来实现的。目标名字空间的缺省值是http://ws.apache.org/axis2。

    Axis2中Web服务有四种会话范围。如果不指定,则默认为 request 会话范围。我们可以通过给 service 节点添加一个可选的 scope参数来指定会话范围,会话范围共有如下四种:

  1. application : 应用级别。生命周期和Axis2引擎生命周期相同。
  2. soapsession : 使用addressing headers中的自定义引用属性来管理会话。
  3. transportsession : 使用transport cookies来管理会话,生命周期和底层的transport相同。
  4. request :生命周期很短,和请求处理周期相同。

    对于该服务中的所有配置,都定义在<service>标签中。

<service scope = 'application' name = 'service1' targetNamespace="http://ws.apache.org/axis2">
    ......
</service>

   3.2部署多个服务

    当需要在一个service.xml中管理多个服务时,使用标签<serviceGroup>,将所有要部署的服务放入<serviceGroup>中。其中的各个service的名称不能相同。

<serviceGroup>
    <service name = 'service1'>
    ......
    </service>
    <service name = 'service2'>
    ......
    </service>
</serviceGroup>

  3.3服务描述

    服务编写者可以使用<description>元素来描述该服务。在Axis2 Web管理控制台中查看服务时,我们只能看到服务名和服务描述。如果我们不给services.xml文件添加description元素,则服务描述栏会显示服务名称。对于那些访问该服务的用户来说,服务描述是非常有用的。添加服务描述信息非常简单,给services.xml文件添加一个可选的description节点就可以了。该节点的值既可以是纯文本,也可以是HTML代码片段。

<description><b>接口服务</b></description>


  3.4服务级参数

    服务级参数通过<parameter>来指定,这些参数供消息上下文(在运行时)、AxisService或者AxisOperation访问。参数有一个必选参数和可选参数:参数名称是必选参数,locked 属性是可选参数。

    locked属性指明了是否允许参数值被子节点覆盖。举例来说,如果我们在axis2.xml文件中添加了一个locked属性值为true的参数,那么如果服务试图在services.xml文件中定义同名参数,是会抛出异常的。

    服务级参数中有一个特殊的参数“ServiceClass”,该参数用于指定服务的具体实现类。但是在Axis2中,Web服务并不强制要求指定服务实现类!Axis2架构允许编写没有服务实现类的Web服务,这是因为消息接收器允许这样做。Axis2中,一旦请求交予消息接收器处理,Axis2引擎就认为自己的事情做完了,剩余工作都是消息接收器的了。因此,services.xml并不强制要求提供服务实现类。但是绝大多数情况下,我们还是需要服务类的,我们可以在services.xml文件中添加ServiceClass参数来指定服务类。该参数的值是服务类的全路径名。

<service >
        ......
	<parameter name="ServiceClass">com.test.TestServer
	</parameter>
        <parameter name="testParameter">ShangHai
	</parameter>
        ......
</service>

  3.5服务级消息接收器

    Axis2中消息接收器是特殊的处理器,是In路径(请求路径)中的最后一个处理器。Web服务中的每个操作都有他自己的消息接收器,而且不同的操作可以有不同的消息接收器。消息接收器是依赖于消息交换模式的,所以我们必须为不同的消息交换模式指定不同的消息接收器。

   怎样才能给所有的操作指定相同的消息接收器呢?只要添加服务级消息接收器即可。如此我们就不必在操作级别指定消息接收器了。我们要做的是指定服务级消息接收器。而在部署时,Axis2会自动给操作选择正确的消息接收器。

   其中RPCInOnlyMessageReceiver用于处理不含返回值的请求。RPCMessageReceiver用于处理带返回值的请求。

<messageReceivers>

<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>

<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>

</messageReceivers>

  3.6排除方法

  Axis2在发布服务时会默认暴露指定的服务实现类中的所有public方法(如果是用java实现),如果我们把.wsdl文件放到META-INF目录中,而由不希望发布文件中的所有操作,那么我们可以添加<excludeOperations>标签来排除那些不希望暴露的操作。

<excludeOperations>

      <operation>op1</operation>

</excludeOperations>

  3.6暴露方法

   Axis2用<operation>标签来声明需要暴露的方法以及重定义指定方法的某些属性。其中的name属性需要与实现类中的方法名相同。

   在方法级别可以使用<messageReceiver>为该方法指定消息接收器。

   使用<actionMapping>来为该方法添加别名。actionMapping相当于操作的别名。我们可以为操作添加任意数量的别名。我们可以根据ActionMapping来过滤请求,也可以为不同的action mapping 执行不同的处理逻辑。客户端请求消息中通过指定SOAPAction或者wsa:action来发送action mapping。这样Axis2的分发器就可以把请求消息分发给正确的操作。

<operation name=doSmt>

<actionMapping>mapping1</actionMapping>

<actionMapping>http://foo.org/doSmt</actionMapping>

<messageReceiver class="org.apache.axis2.MyMessageReceiver"/>

</operation>

  3.7部署定义

    当生成WSDL文件(运行时)或者生成schema(部署时)的时候,如果在META-INF目录中找不到WSDL文件,则可以通过往services.xml文件中添加<schema>节点来指定自定义的schema。

    在部署的时候,如果不指定schema目标名字空间,则根据服务实现类的全路径名来生成目标名字空间。例如,如果服务类的全路径名是org.apache.axis2.FooService,那生成的schema名字空间是http://FooService.axis2.apache.org/xsd,如果你想使用自定义值,只需要在<schema>节点中指定schemaNamespace属性即可。

    在使用Java类生成WSDL文件时,WSDL文件中schema定义中的elementFormDefault默认是设置为qualified。如果qualified为true,则响应消息中的所有元素都是受限的。但是有些时候我们并不需要这种行为,我们希望把elementFormDefault设置为unqualified。这时我们只需要在<schema>中重定义elementFormDefaultQualified属性即可。

<service>

<schema elementFormDefaultQualified="false" schemaNamespace="http://foo.org/xsd"/>

</service>

3.8在指定的传输通道上暴露服务

    Axis2可以在多种传输通道上暴露服务,这是通过Lister Manager完成的。例如,使用Listener Manager你可以在HTTP和TCP上暴露服务。

    由于Axis2支持多种传输通道,所以我们可以在选定的传输通道上暴露服务。比如说系统管理服务,我们希望该服务只在支持SSL的通道上暴露,这样才能保证系统管理的安全性。

    当服务端支持多种传输通道时,所有的服务都是在所有的通道上暴露的。如果只希望在选定的通道上暴露服务,我们需要在services.xml文件中添加<transport>标签。

<transports>

<transport>https</transport>

</transports>

  3.9使用模块

    我们可以在服务级和方法级使用指定的模块,使用<module>引用指定的模块,如果引用的模块错误,会导致该模块影响的服务和方法不可用。

<service>

<module ref="foo"/>



<operation name=doSmt>

<module ref="foo1"/>

</operation>


</service>


要实现Spring Boot整合Axis1.4实现WebService服务端,可以按照以下步骤进行: 1. 在pom.xml文件中添加Axis1.4依赖: ``` <dependency> <groupId>org.apache.axis</groupId> <artifactId>axis</artifactId> <version>1.4</version> </dependency> ``` 2. 创建一个WebService接口,并在接口上添加@WebService注解: ``` @WebService public interface UserService { String sayHello(String name); } ``` 3. 创建一个WebService接口的实现类,并在实现类上添加@WebService(endpointInterface = "com.example.demo.UserService")注解: ``` @WebService(endpointInterface = "com.example.demo.UserService") public class UserServiceImpl implements UserService { @Override public String sayHello(String name) { return "Hello, " + name + "!"; } } ``` 4. 在Spring Boot的配置文件application.properties中添加Axis1.4的配置: ``` # Axis1.4配置 axis.servletPath=/services/* ``` 5. 创建一个AxisServlet的注册类,并在类上添加@Configuration和@EnableWebMvc注解: ``` @Configuration @EnableWebMvc public class AxisServletRegistration { @Bean public ServletRegistrationBean<AxisServlet> axisServlet() { ServletRegistrationBean<AxisServlet> registration = new ServletRegistrationBean<>(new AxisServlet(), "/services/*"); registration.addInitParameter("axis.servicesPath", "/WEB-INF/services"); registration.addInitParameter("axis.wsddPath", "/WEB-INF/server-config.wsdd"); return registration; } } ``` 6. 启动Spring Boot应用程序,访问http://localhost:8080/services/UserService?wsdl,可以看到WebService服务端已经成功启动。 以上就是Spring Boot整合Axis1.4实现WebService服务端的全部步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值