Soap服务模拟及服务编排方式
一. Soap协议服务模拟
1. 添加Springws与jdom的支持
该文档所描述的模拟Soap协议的服务是在Spring + Maven项目的基础上创建,在l文件中增加如下jar包。
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom2</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.3</version>
</dependency>
2.添加l文件
在配置文件中添加spring-ws.xml文件。
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"
xmlns:sws="/schema/web-services"
xsi:schemaLocation="/schema/beans www.spring
/schema/beans/spring-beans-3.0.xsd
/schema/web-services /schema/web-services/web-services-2.0.xsd
/schema/context /schema/context/spring-context-3.0.xsd">
❶ <context:component-scanbase-package="ss.ehub.ssb.simulator.ws"/>
❷ <sws:annotation-driven/>
<beanid="product_appService"
class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition">
❸ <constructor-argvalue="classpath:wsdl/product_appService.wsdl"/>
</bean>
</beans>
注1.类似SpringMVC扫描@Controller包,这里要扫描注解为@Endpoint的包。
2.开启注解(@Endpoint、@PayloadRoot等)。
3. 存放wsdl的路径。
3. 添加webserviceservlet
在l中添加转发soap协议请求的servlet,如下。
<!-- Web service servlet -->
<servlet>
<servlet-name>spring-ws</servlet-name>
<servlet-class>org.ansport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:l</param-value>
</init-param>
<init-param>
<param-name>transformWsdlLocations</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>param namespring-ws</servlet-name>
<url-pattern>/ws/*</url-pattern>
</servlet-mapping>
注意l的路径和mapping路径。
4. 编写Endpoint
在被扫描的包下编写Endpoint,每个wsdl文件可以编写一个Endpoint,每个wsdl里面的方法为一个Endpoint的方法,如下。
❶ @Endpoint
publicclassUserPlanProdEnpoint {
❷ privatestaticfinal String NAMESPACE_URI = "www.asiainfo/obd/product_app.obd";
❸ @PayloadRoot(namespace = NAMESPACE_URI, localPart = "get_userPlanProd")
❹ @ResponsePayload
❹ public Element get_userPlanProd(@RequestPayload Element param, @RequestPayload Element param2){
❺ Element element = ElementFromXmlFile("");
returnelement;
}
}
注1.被扫描的类用Endpoint注解。
2. 务必保证namespace与wsdl里面的namespace一致。
3. @PayloadRoot注解在方法上面,“localPart”为wsdl里面对应的方法名字,务必一致。
4. @RequestPayload和@ResponsePayload可以把soap报文映射为jdom元素,也可以映射为jaxb注解的java类,这里简单的映射为jdom元素。务必保证Element类导入的包为“jdom2”,而不是“jdom”,否则可能会报不到Endpoint的错误。
5. 使用封装好的工具返回一个jdom Element元素,该工具传入记录返回报文模板的文件,该文件放在资源目录下的response-templ文件夹下。
二. 服务编排方式
由于soap报文参数过多的时候,科大的产品需要创建很多环节对应每个参数,所以可以在soap服务调用前一个环节把soap报文创建好,在soap模板里面把整个报文当成一个参数选择。如下。
1. 简单的映射封装
在groovy项目中封装了一个工具类WebServiceUtil,里面的方法soapInputParamsMapping接收一个request报文(可以在SoapUI得到,不需要去掉问号)和一个Map,返回一个填好参数的请求报文。Map中键值对为request的节点名字和对应的值。由于不确定OEGW传来的是什么形式的报文,目前只能做到这一步,后续会根据实际情况改进。
defparam = [:]
param._client_ip = "12345"
param._client_mac = "ABCDE"
param._verify_code = "455677"
param._phone_id = "008"
param._so_region_code = "haobing"
param._so_county_code = "haobing"
param._so_org_id = "haobing"
printlnWebServiceUtil.soapInputParamsMapping(request, param)
2.服务的编排
把groovy项目打为一个jar包,放在esi-7.2/zuhe/apache-tomcat-7.0.37/webapps/orch-camle/WEB-INF/lib/的下面,可以直接调用里面的方法,简化页面代码,提高编排效率。注意,需要替换掉科大原来的groovy低版本。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论