如何在Spring MVC中使用第三方WSDL服务

2023-11-29

我编写了一些服务(由 Android 应用程序使用),它接受请求并以 json 形式发送响应。现在我有一个场景,我必须通过提供的 WSDL 文件使用第三方 Web 服务。我不知道该怎么做,有人可以帮忙吗?

这是我的dispatcher-servlet.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans ">

    <context:property-placeholder location="classpath:jdbc.properties" />   
    <context:component-scan base-package="com.srihari" />

    <tx:annotation-driven transaction-manager="hibernateTransactionManager" /> 

    <mvc:annotation-driven />

    <bean id="jspViewResolver"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/view/" />
        <property name="suffix" value=".jsp" />
    </bean>

     <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${database.driver}" />
        <property name="url" value="${database.url}" />
        <property name="username" value="${database.user}" />
        <property name="password" value="${database.password}" />
    </bean>

    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="annotatedClasses">
            <list>              
                <value>com.srihari.model.User</value>                       
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
               <prop key="hibernate.hbm2ddl.auto">update</prop>
            </props>
        </property>
    </bean>

    <bean id="hibernateTransactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean> 
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>

//This is used to convert my requests and responses into json automatically

    <bean id="jacksonMessageChanger" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes" value="application/json"/>
    </bean>

    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <util:list id="beanList">
                <ref bean="jacksonMessageChanger"/>
            </util:list>
        </property>
    </bean>

    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="mediaTypes">
            <map>
                <entry key="json" value="application/json"/>
                <entry key="html" value="text/html"></entry>
                <entry key="xml" value="application/xml"></entry>
            </map>
        </property>
    </bean>

</beans>

这是我的简单控制器:这些服务运行良好

@Controller
@RequestMapping("/home")
public class UserController {

    @RequestMapping(value="/getallusers",method = RequestMethod.GET)
    public @ResponseBody List<User> getallusers() 
    {
        List<User> allUsersDetails =userServices.getAllUsers();
        return allUsersDetails;
    }
}

这是第三方提供的WSDL文件

POST /someservices/otherService.asmx HTTP/1.1
Host: sriharicorp.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/CreateCard"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <UserCredentials xmlns="http://tempuri.org/">
      <Password>string</Password>
      <Username>string</Username>
    </UserCredentials>
  </soap:Header>
  <soap:Body>

Example String Request 

    <CreateCard xmlns="http://tempuri.org/">
      <request>
        <DePpAcctCreationDate>string</DePpAcctCreationDate>
        <DePpAcctCreationTime>string</DePpAcctCreationTime>
        //Some other fields also
      </request>
    </CreateCard>
  </soap:Body>
</soap:Envelope>

字符串响应示例

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <CreateCardResponse xmlns="http://tempuri.org/">
      <CreateCardResult>
        <RequestType>string</RequestType>
        <ProductType>string</ProductType>
        <ResponseCode>string</ResponseCode>
        <ReasonDescription>string</ReasonDescription>
      </CreateCardResult>
    </CreateCardResponse>
  </soap:Body>
</soap:Envelope>

我终于能够访问第三服务了。

这是我访问服务的方法

   public void createSoapActionCallBack(ValidateCardRequest validateCardRequest) {

        //This is used to send header message
        SoapActionCallback actionCallBack=new SoapActionCallback(soapAction);
        try{

            actionCallBack = new SoapActionCallback(ResponseConstants.SOAPACTION_DEFAULT_URL) {
            public void doWithMessage(WebServiceMessage msg) {
                    SoapMessage smsg = (SoapMessage)msg;                
                    SoapHeader soapHeader = smsg.getSoapHeader();

                    try{
                        //To send header message
                        StringSource headerSource = new StringSource("<UserCredentials xmlns='URL'>\n" +
                                        "<userid>"+"ABCD"+"</userid>\n" +
                                        "<password>"+"ABCD"+"</password>\n" +
                                        "</UserCredentials>");
                        Transformer transformer = TransformerFactory.newInstance().newTransformer();
                        transformer.transform(headerSource, soapHeader.getResult());

                        smsg.setSoapAction(soapAction);
                    }catch(Exception e)
                    {
                        e.printStackTrace();
                    }
                }
                }; 
               validateCardResponse = (FVValidateCardResponse) webServiceTemplate.marshalSendAndReceive(URL, validateCardRequest, actionCallBack);  

            } catch (Exception e) {
                e.printStackTrace();
            }       
}

这是我的配置 xml 文件:

<bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
        <property name="soapVersion">
            <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_12"/>
        </property>
    </bean>

    <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<!-- If we want to use contextPath then we mush create ObjectFactory class in the described Package-->
        <!-- <property name="contextPath" value="com.waleteros.firstviewmodel" /> -->

        <property name="classesToBeBound">
            <list>
                <value>com.waleteros.firstviewmodel.FVValidateCardRequest</value>
                <value>com.waleteros.firstviewmodel.FVValidateCardResponse</value>               
            </list>
        </property>
    </bean>

    <bean id="webServiceTemplate" class="org.springframework.ws.client.core.WebServiceTemplate">
        <constructor-arg ref="messageFactory" />
        <property name="marshaller" ref="marshaller"></property>
        <property name="unmarshaller" ref="marshaller"></property>
        <property name="messageSender">
            <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender"/>            
        </property>
        <!-- <property name="defaultUri" value="https://www.firstviewcorp.com/dbbapplications/ServicesSS/Selfservice.asmx?wsdl"/> -->
    </bean>

根据您的 xml 创建 pojo 这是例子

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "CardUpdateResponse",namespace="http://www.corecard.com/Prepaid")
public class FVCardUpdateResponse {

    @XmlElement(name="CARDUPDATE_RET", namespace="http://www.corecard.com/Prepaid")
    private CARDUPDATE_RET response;
    //Getters and Setters   

    public static class CARDUPDATE_RET{

        @XmlElement(name = "ACCOUNTNUMBER", namespace="http://www.corecard.com/Prepaid")
        private String AccountNumber;

        @XmlElement(name = "ResCode", namespace="http://www.corecard.com/Prepaid")
        private String ResCode;

        @XmlElement(name = "ResErrorCode", namespace="http://www.corecard.com/Prepaid")
        private String ResErrorCode;

        @XmlElement(name = "ResErrorMsg", namespace="http://www.corecard.com/Prepaid")
        private String ResErrorMsg;
        //Getters and Setters
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Spring MVC中使用第三方WSDL服务 的相关文章

随机推荐

  • 谷歌折线图 X 轴上有双标签

    我正在研究谷歌折线图 我想在 x 轴上加双标签 日期明智的过程 我可以使用下面的代码绘制没有日期的图表 但无法填充日期 div style width 100 height 1 div
  • 错误:getaddrinfo ENOTFOUNDregistry.npmjs.orgregistry.npmjs.org:443

    我正在公司网络上工作 正在尝试安装npm 但我一次又一次地收到此错误 npm install npm ERR Windows NT 6 1 7601 npm ERR argv C Program Files nodejs node exe
  • 在 Swift 中声明自引用指针[重复]

    这个问题在这里已经有答案了 这段 Obj C 代码在 swift 中的等价物是什么 我猜测 CMutableVoidPointer 的一些事情 static void CapturingStillImageContext Capturing
  • Nhibernate 通过用户定义的函数输出进行过滤

    我对 NHibernate 相当陌生 到目前为止一切都进展顺利 但我遇到了一个问题 我不太确定如何解决 基本上我需要按用户定义函数的输出进行过滤 如果我用 SQL 编写 我会这样写 declare Latitude decimal decl
  • Coldfusion 8 同时执行 CFIf 和 CFElse 语句

    我正在为电子商务网站制作用户注册应用程序 但我遇到了一个非常奇怪的问题 当我运行这段代码时
  • C++ 中的临时对象确实是 const 吗?

    我一直认为C 中的临时对象会被编译器自动视为const 但最近我经历了以下代码示例 function returning object some non const method 对 C 编译器有效 这让我想知道 C 中的临时对象确实是 c
  • PHP 匿名函数:未定义的变量

    我有这两个 WordPress 功能 wpb set post views function postID count key wpb post views count count get post meta postID count ke
  • Codeigniter 与本地主机 (XAMPP) 中的路径有关的问题

    无论如何 我的代码点火器安装中的索引页面 又名 homepage php 都工作正常 The problem lies with using subdirectories to store other pages currently its
  • android 中网页视图内容闪烁?

    我在用着this用于水平滑动的 lib 检查下面的代码 滑动功能工作正常 但当我直接滑动时 不会在网页视图上显示内容 显示下面的一些图片以了解更多详细信息 在上图之后 当我滑动时 它效果很好 但是当我们想直接进入下一张幻灯片时 就会面临如下
  • 始终显示 AVPlayer 控件

    我有一个 AVPlayerViewController 里面有一个 AVPlayer 我需要的是播放器的控件 播放 暂停 时间滑块 永远不会隐藏 现在 在播放视频大约 4 秒后 它们就会隐藏起来 您必须点击屏幕才能再次显示它们 我无法找到解
  • 当menuItem中使用shiny和shinydashboard的更多功能时,tabItem无法显示内容

    我正在学习闪亮和闪亮的仪表板 我的代码是这样的 library shiny library shinydashboard library DT library RODBC library stringr library dplyr ch l
  • 如何在 Yesod 应用程序中的 GHCi 中执行数据库查询

    例如 如何使用 Yesod 应用程序的模型将新用户插入数据库 或者 还有更好的方法 我正在处理脚手架应用程序 现在我创建了App实例 但不知道如何使用它执行请求 i Extra data Extra Extra extraCopyright
  • 如何将svg中的一条路径分成两条路径

    我对 svg 语法非常陌生 我想知道如何将一条路径分成两条路径 实际上我有这样的东西 M Xm Ym C Xc1 Yc1 Xc2 Yc2 Xc3 Yc3 C Xd1 Yd1 Xd2 Yd2 Xd3 Yd3 C 是我要分割路径的地方 我想将其
  • Oozie 与 Hadoop 2,作业挂在“RUNNING”状态

    我有一个带有 java 操作节点的工作流程作业 使用 Hadoop 2 1 0 2 0 4 0 38 和 Oozie 3 3 2 2 0 4 0 运行 当我提交作业时 我在 Hadoop 资源管理器屏幕中看到 2 行 1 原职位名称 2 使
  • C++内存模型是否提供有关构造函数操作的保证[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 如何确保新构造的不可变对象可以在 C 线程之间安全共享 C 内存模型是否为构造函数的操作提供保证 当多个线程共享对某个对象的访问并且该对象被修改时 可能会出现竞争危险 这些问题可
  • IIS WCF 服务托管与 Windows 服务

    我们开发了一个 WCF 服务 并希望部署它 我们的客户将使用它basicHttpBinding但我们的内部团队将使用它namedPipesBinding 我们想知道将其托管在 IIS 7 中或使用 Windows 服务是否更好 我们运行了一
  • 无法安装 numpy - 需要 MS Visual C++ 14.1。但是已经安装了

    我在 Windows 10 上使用 pypy3 6 v7 3 0 我正在尝试安装 numpypip install numpy 但我不断收到错误 error Microsoft Visual C 14 1 is required Get i
  • 根据 Woocommerce 中的选定值显示或隐藏注册字段

    我正在尝试为我的网站定制注册表单 我一直在使用本指南 并已成功为我的注册表单创建 存储其他字段 定制注册指南 I have created a drop down select field in my registration form f
  • SQLite 中如果不存在则更改表添加列

    我们最近需要向一些现有的 SQLite 数据库表添加列 这可以通过以下方式完成ALTER TABLE ADD COLUMN 当然 如果表已经被更改 我们不想理会它 不幸的是 SQLite 不支持IF NOT EXISTS条款ALTER TA
  • 如何在Spring MVC中使用第三方WSDL服务

    我编写了一些服务 由 Android 应用程序使用 它接受请求并以 json 形式发送响应 现在我有一个场景 我必须通过提供的 WSDL 文件使用第三方 Web 服务 我不知道该怎么做 有人可以帮忙吗 这是我的dispatcher serv