1

認証失敗後に 401 HTTP_response を返したいです。以下の構成で http:response-builder コンポーネントを使用してこれを実行しようとしています。フロー内の前のことは気にしません。この時点に到達したら、これを行う必要があるだけです。

<flow name="main" doc:name="main">
<http:inbound-endpoint exchange-pattern="request-response"
    address="http://localhost:8081/example" doc:name="HTTP" />
<byte-array-to-string-transformer
    doc:name="Byte Array to String" />
<cxf:proxy-service namespace=""
        service="" payload="envelope"
        wsdlLocation=""
        enableMuleSoapHeaders="false" doc:name="ProxyService"/>
<cxf:proxy-client payload="envelope" enableMuleSoapHeaders="true" doc:name="ProxyClient" />
<http:outbound-endpoint exchange-pattern="request-response"
        address=""
        doc:name="request" />
<byte-array-to-string-transformer
    doc:name="Byte Array to String" />
<logger message="The payload after the request is:#[payload]"
    level="INFO" doc:name="Logger" />
<choice doc:name="Choice">
...
<otherwise>
    <processor-chain>
        <logger message="Failed authentication is:#[payload]" level="INFO"
            doc:name="Logger" />
        <http:response-builder status="401"
            doc:name="HTTP Response Builder">
            <set-payload value="Authentication Failed" />
        </http:response-builder>
    </processor-chain>
</otherwise>

soapUI から受け取ったエラー

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring>Could not find a transformer to transform "SimpleDataType{type=org.mule.transport.http.HttpResponse, mimeType='text/xml'}" to "SimpleDataType{type=java.io.InputStream, mimeType='*/*'}". (org.mule.api.transformer.TransformerException). Message payload is of type: PostMethod</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>.

これは、現在のメッセージが text/xml であり、不明なタイプを返そうとしていることを示しています。ビルダーのコンテンツ タイプを text/xml に設定してみましたが、同じ結果が得られました

編集:現在のステータスは HTTP/1.1 500 Internal Server Error です

お読みいただきありがとうございました。

4

1 に答える 1

1

http:response-builderその出力は HTTP インバウンド エンドポイントでは直接処理されず、cxf:proxy-service. 応答がインバウンド エンドポイントに向かうフローの下流にcxf:proxy-service到達すると、SOAP 応答の準備を担当する にヒットします。SOAP ペイロードを持つメッセージのみを処理でき、ステータス コードを厳密に制御し、それを設定しようとする試みをオーバーライドします。フローの他の場所まで。さらに、あなたの場合、非 SOAP 応答を構築しているためcxf:proxy-service、応答を処理するときにさらに不幸になります。

そのため、失敗したログインの検出を HTTP 応答の構築から分離し、HTTP 応答の構築をフローの応答フェーズに配置するのが秘訣です。これは与える:

<flow name="main" doc:name="main">
    <http:inbound-endpoint exchange-pattern="request-response"
        address="http://localhost:8081/example" doc:name="HTTP" />
    <response>
        <expression-filter expression="#[flowVars.authenticationFailed]" />
        <http:response-builder status="401"
            doc:name="HTTP Response Builder">
            <set-payload value="Authentication Failed" />
        </http:response-builder>
    </response>
    <byte-array-to-string-transformer
        doc:name="Byte Array to String" />
    <cxf:proxy-service namespace=""
            service="" payload="envelope"
            wsdlLocation=""
            enableMuleSoapHeaders="false" doc:name="ProxyService"/>
    <cxf:proxy-client payload="envelope" enableMuleSoapHeaders="true" doc:name="ProxyClient" />
    <http:outbound-endpoint exchange-pattern="request-response"
            address=""
            doc:name="request" />
    <byte-array-to-string-transformer
        doc:name="Byte Array to String" />
    <logger message="The payload after the request is:#[payload]"
        level="INFO" doc:name="Logger" />
    <set-variable variableName="authenticationFailed" value="false" />
    <choice doc:name="Choice">
    ...
    <otherwise>
        <processor-chain>
            <logger message="Failed authentication is:#[payload]" level="INFO"
                doc:name="Logger" />
            <set-variable variableName="authenticationFailed" value="true" />
        </processor-chain>
    </otherwise>

フロー変数 ( という名前authenticationFailed) を使用して応答を制御していることに注意してください。

于 2012-10-18T16:28:33.657 に答える