web-dev-qa-db-ja.com

wsdlを使用してSPRING-WSでWebサービスサービスを使用する

私はWSDLを持っています.eg:/ sample/hello?wsdl Spring-wsで設定することにより、サービスをWebサービスに呼び出したい。このwsdlをパラメーターとしてspringconfig.xmlのタグに渡しました。 Spring-wsでこのWebサービスを使用する方法を教えてください。

19
pandeis

1.プロジェクトの依存関係を設定する

次の依存関係をpomファイルに追加します。

<dependency>
    <groupId>org.springframework.ws</groupId>
    <artifactId>spring-ws-core</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.Apache.httpcomponents</groupId>
    <artifactId>httpclient</artifactId>
    <version>4.2.5</version>
</dependency>

2. Webサービスアプリケーションコンテキストを設定する

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

    <bean id="messageFactory" class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" />

    <bean id="marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="contextPath" value="com.yourcomany.model" />
    </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="http://<hostname>:<portnumber>/sample/hello" />
    </bean>

</beans>

3. SOAP要求/応答オブジェクトにマップするモデルクラスを設定します

たとえば、SOAPリクエストXMLが

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xxx="http://yourcomapny.com">
   <soapenv:Header/>
   <soapenv:Body>
      <xxx:InputParameters>
         <xxx:paramONE>1</xxx:paramONE>
      </xxx:InputParameters>
   </soapenv:Body>
</soapenv:Envelope>

そして、SOAP応答XMLは次のようになりました。

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
   <env:Header>
      ...
   </env:Header>
   <env:Body>
      <xxx:OutputParameters xmlns:xxx="http://yourcompany.com">
         <xxx:paramONE>0</xxx:paramONE>
      </xxx:OutputParameters>
   </env:Body>
</env:Envelope>

対応するクラス(marshaller Beanで指定したパッケージの下:com.yourcompany.model)はそれぞれ次のようになります。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "paramONE" })
@XmlRootElement(name = "InputParameters", namespace = "http://yourcompany.com")
public class InputParameters {

    @XmlElement(required = true, namespace = "http://yourcompany.com")
    private String paramONE;

    public String getParamONE() {
        return paramONE;
    }

    public void setParamONE(String paramONE) {
        this.paramONE = paramONE;
    }

}

そして

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = { "paramONE" })
@XmlRootElement(name = "OutputParameters", namespace = "http://yourcompany.com")
public class OutputParameters {

    @XmlElement(required = true, namespace = "http://yourcompany.com")
    private BigDecimal paramONE;

    public BigDecimal getParamONE() {
        return this.paramONE;
    }

    public void setParamONE(BigDecimal paramONE) {
        this.paramONE= paramONE;
    }

}

4.(パッケージcom.yourcompany.modelの下に)オブジェクトファクトリを追加して、要求/応答オブジェクトを作成します。

@XmlRegistry
public class ObjectFactory {

    public ObjectFactory() {
    }

    public InputParameters createYourRequest() {
        return new InputParameters();
    }

    public OutputParameters createYourResponse() {
        return new OutputParameters();
    }

}

5.サービスを使用するクライアントを作成します

インタフェース:

public interface YourService {

    BigDecimal getValue(String paramOne);

}

実装

@Component("yourServiceClient")
public class YourServiceClient implements YourService {

    private static final ObjectFactory WS_CLIENT_FACTORY = new ObjectFactory();

    private WebServiceTemplate webServiceTemplate;

    @Autowired
    public YourServiceClient(WebServiceTemplate webServiceTemplate) {
        this.webServiceTemplate = webServiceTemplate;
    }

    @Override
    public BigDecimal getValue(String paramOne) {
        InputParameters request = WS_CLIENT_FACTORY
                .createYourRequest();
        request.setParamONE(paramOne);

        OutputParameters response = (OutputParameters) webServiceTemplate
                .marshalSendAndReceive(request);

        return response.getParamONE();
    }

}
48
Taoufik Mohdit

@Taoufik Mohditの回答は完了です!!

入力および出力オブジェクトを構築するには、 Webservice-Client:Spring WS、JAXB、およびたった1つのWSDLファイルでの一般的なアプローチ? を使用して、これらのオブジェクトを自動的に構築します

2
Alireza Fattahi

この質問がまだ活発であることを考えると、Spring Web Servicesフレームワークの最新バージョンとSpringが一般的に導入する多くの変更を反映する更新を投稿すると思いました。

  1. Spring Bootの導入により、「スターター」POMを活用してMaven構成を簡素化できます。 Spring-WSには特定のspring-boot-starter-web-servicesスターターがあります
  2. XMLを使用してSpring構成ファイルを指定する代わりに、Springを構成するためのタイプセーフなpure-Javaオプションを提供する Spring JavaConfig が導入されました。
  3. 特定のWSDLファイルに基づく要求/応答オブジェクトの生成は、Mavenプラグインを使用して自動化できます。 Spring-WSの例で使用されるプラグインはmaven-jaxb2-pluginです。

WebServiceTemplateは、引き続きクライアント側のWebサービスアクセスのコアクラスです。詳細については、これを確認できます WSDLファイルからSpring-WSを使用してWebサービスを使用する方法の詳細な例 私が書いたもの。

0
CodeNotFound