こんにちは WSO2 コミュニティ、こんにちは Stackoverflow です。
ESB から開始する SOA スイートのテストは順調に進んでいます。ESB は外部サービスを認識し、正しい結果を返す正しいプロキシを作成します。
解決した
それについては、2 つの問題があります。1 つ目は、「試してみる」機能で例外が発生することです。
"Cannot find dispatch method for {http://schemas.xmlsoap.org/soap/envelope/}Envelope
[tagOpened]/soapenv:Text[tagClosed]"
プロキシされたWebサービスのモックサービス用に作成されたSOAPエンベロープを送信しようとすると.
とにかく、(Netbeans で作成された) 外部クライアントからプロキシ サービスを試すと、うまく機能します。
答え
最初の部分については、ブラウザから Java スクリプト スタブを介してメッセージを送信しているため、おそらくクロス ドメインの問題が原因です。リクエストが同じドメインを通過するため、サービス自体が ESB 自体でホストされている場合、これはうまく機能することがわかります。これが、通常のクライアント呼び出しでは完全に機能しますが、試してみると機能しない理由です。
2 つ目の問題は、2 つのサービスを調整できないことです。私の目的は、最初のサービスの入力を 2 番目のサービスに送信し、次にユーザーに送信することです。
私は、Tharindu Mathew が提案したチュートリアルに取り組んでいます。XSLT 変換という 1 つの点を除いて、すべてが理解できるようになりました。
チュートリアルで作成するように提案されているアウト シーケンスは次のとおりです。
<outSequence xmlns="http://ws.apache.org/ns/synapse">
<switch source="get-property('STATE')">
<case regex="PERSON_INFO_REQUEST">
<log level="full">
<property name="sequence" value="outSequence - STATE 01 - response from PersonInfoService" />
</log>
<xslt key="xslt">
<property name="amount" expression="get-property('ORG_AMOUNT')" />
</xslt>
<log level="full">
<property name="sequence" value="outSequence - STATE 01 - request for CreditService" />
</log>
<property name="STATE" value="CREDIT_REQUEST" />
<send>
<endpoint key="CreditEpr" />
</send>
</case>
<case regex="CREDIT_REQUEST">
<log level="full">
<property name="sequence" value="outSequence - STATE 02 - response from CreditService" />
</log>
<send />
</case>
</switch>
</outSequence>
ここで、スイッチの最初のケースの XSLT ノードに注目すると、金額プロパティの get だけがあることがわかります。そのため、ID を示すシーケンスからの XML があると思います。これは amount プロパティを取得します (それが何をするのかはわかりません)。
チュートリアルでは、次のことを提案しています。
この CrediService へのリクエストを作成するには、XSLT メディエーターで次の XSLT を使用します。この XSLT に保存した ORG_ID を XSLT パラメータとして使用し、XSLT メディエータも使用していることに注意してください。
チュートリアルで示した XSLT は次のとおりです。
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/02/xpath-functions"
xmlns:ns="http://samples.esb.wso2.org"
xmlns:ax21="http://samples.esb.wso2.org/xsd"
exclude-result-prefixes="ns fn">
<xsl:param name="amount"/>
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="//ns:getResponse" />
</xsl:template>
<xsl:template match="ns:getResponse" xmlns:ns="http://samples.esb.wso2.org">
<sam:credit xmlns:sam="http://samples.esb.wso2.org" xmlns:xsd="http://samples.esb.wso2.org/xsd">
<sam:info>
<xsd:amount><xsl:value-of select="$amount"/></xsd:amount>
<xsd:personInfo>
<xsd:address><xsl:value-of select="ns:return/ax21:address"/></xsd:address>
<xsd:id><xsl:value-of select="ns:return/ax21:id"/></xsd:id>
<xsd:name><xsl:value-of select="ns:return/ax21:name"/></xsd:name>
</xsd:personInfo>
</sam:info>
</sam:credit>
</xsl:template>
</xsl:stylesheet>
同様のファイルを WSO2 ESB の resources ディレクトリに配置するように求められましたが、このファイルはチュートリアルでは使用されません。
サンプル zip 内の personToCredit.xslt を WSO2 ESB の resources ディレクトリにコピーします。
----------小括弧-----------
次のように記述された後も、WSDL ファイルは使用されませんでした。
サンプル zip 内の CreditProxy.wsdl を WSO2 ESB の resources ディレクトリにコピーします。
Configuration/Governance Registry に WSDL ファイルが見つからず、対処方法がわからないため、代わりにインラインで指定することにしました。
---------小括弧の終わり-----------
この文の後に、XSLT ファイルのテキストが続きます。私の主な質問は次のとおりです。
この XSLT はどこに配置すればよいですか? XSLT メディエーターをどこに配置すればよいか、ビルド方法もわかりません。レジストリに依存する必要がありますか?
完璧な答えは、out シーケンスのコードであり、XSLT メディエーターとの指定された接続が示唆されている可能性があります。
オーバーザビットステア