1

現在、基本認証を使用するかなり単純なミュールフローを書いています

<custom-transformer class="com.org.HttpRequestToMyRequest" name="HttpRequestToMyRequest" doc:name="Java"/>
<flow name="Input_Flow" doc:name="Input_Flow">
        <http:inbound-endpoint exchange-pattern="request-response" host="http://12.23.34.45" port="1234" path="/foo">
            <mule-ss:http-security-filter realm="mule-realm"/>
        </http:inbound-endpoint>
    <flow-ref name="Sorting_Flow" doc:name="Sorting flow"/>
</flow>
<sub-flow name="Sorting_Flow" doc:name="Sorting_Flow">
    <transformer ref="HttpRequestToMyRequest" doc:name="Transform Http Request to POJO with interesting methods"/>
    <enricher target="#[variable:authorized]">
        <http:outbound-endpoint exchange-pattern="request-response" host="12.34.45.56" port="1234" path="foo/bar" method="GET" disableTransportTransformer="true" 
        responseTransformer-refs="ObjectToString" doc:name="Authorization Service"/>
    </enricher>
    <choice doc:name="Choice">
        <when expression="header:INVOCATION:authorized=true">
            <processor-chain>
                <component class="com.org.MyClass"/>
                <transformer ref="MyObjToString"/>
                <http:response-builder status="200" contentType="text/xml" doc:name="HTTP Response Builder"/>
            </processor-chain>
        </when>
        <when SOMETHING ELSE>
            DO SOMETHING ELSE
        </when>
    </choice>
</sub-flow>

http-security-filter を削除すると、このフローは期待どおりに機能し、MuleMessage のペイロードは HttpRequestToMyRequest トランスフォーマーによって返されるタイプ MyRequest になります。しかし、セキュリティ フィルターを追加すると、エンリッチャーがペイロードを予想される型から byte[] に変更します。byte[] を文字列に変換すると、MyRequest (com.org.MyRequest@15ae9009) のインスタンス名であることがわかります。

ヘルプやアイデアをいただければ幸いです。

編集

ただ明確にします。ここに 3 つのフロー xml フラグメントがあり、そのうち 2 つは正常に動作し、最後の 1 つは理解できない奇妙な動作をしています。

インバウンド エンドポイントの security-filter をコメントアウトしたこのフローは期待どおりに機能し、ClassNameLogger ステートメントは String、MyRequest、MyRequest の順に出力されます。

<custom-transformer class="com.org.HttpRequestToMyRequest" name="HttpRequestToMyRequest" doc:name="Java"/>
<custom-transformer class="com.org.ClassNameLogger" name="ClassNameLogger" doc:name="Java"/>
<flow name="Input_Flow" doc:name="Input_Flow">
        <http:inbound-endpoint exchange-pattern="request-response" host="http://12.23.34.45" port="1234" path="/foo">
            <!-- <mule-ss:http-security-filter realm="mule-realm"/> -->
        </http:inbound-endpoint>
    <flow-ref name="Sorting_Flow" doc:name="Sorting flow"/>
</flow>
<sub-flow name="Sorting_Flow" doc:name="Sorting_Flow">
    <transformer ref="ClassNameLogger" doc:name="Logs The Class Name of MuleMessage payload"/>
    <transformer ref="HttpRequestToMyRequest" doc:name="Transform Http Request to POJO with interesting methods"/>
    <transformer ref="ClassNameLogger" doc:name="Logs The Class Name of MuleMessage payload"/>
    <enricher target="#[variable:authorized]">
        <http:outbound-endpoint exchange-pattern="request-response" host="12.34.45.56" port="1234" path="foo/bar" method="GET" disableTransportTransformer="true" 
        responseTransformer-refs="ObjectToString" doc:name="Authorization Service"/>
    </enricher>
    <transformer ref="ClassNameLogger" doc:name="Logs The Class Name of MuleMessage payload"/>
    <choice doc:name="Choice">
        <when expression="header:INVOCATION:authorized=true">
            <processor-chain>
                <component class="com.org.MyClass"/>
                <transformer ref="MyObjToString"/>
                <http:response-builder status="200" contentType="text/xml" doc:name="HTTP Response Builder"/>
            </processor-chain>
        </when>
        <when SOMETHING ELSE>
            DO SOMETHING ELSE
        </when>
    </choice>
</sub-flow>

エンリッチャーをコメントアウトしたこのフローは、エンリッチャーによって設定された変数が定義されていないため、チョイスに入らないという事実を除けば、期待どおりに機能します。ClassNameLogger ステートメントは、String、MyRequest、MyRequest の順に出力します。

<custom-transformer class="com.org.HttpRequestToMyRequest" name="HttpRequestToMyRequest" doc:name="Java"/>
<custom-transformer class="com.org.ClassNameLogger" name="ClassNameLogger" doc:name="Java"/>
<flow name="Input_Flow" doc:name="Input_Flow">
        <http:inbound-endpoint exchange-pattern="request-response" host="http://12.23.34.45" port="1234" path="/foo">
            <mule-ss:http-security-filter realm="mule-realm"/>
        </http:inbound-endpoint>
    <flow-ref name="Sorting_Flow" doc:name="Sorting flow"/>
</flow>
<sub-flow name="Sorting_Flow" doc:name="Sorting_Flow">
    <transformer ref="ClassNameLogger" doc:name="Logs The Class Name of MuleMessage payload"/>
    <transformer ref="HttpRequestToMyRequest" doc:name="Transform Http Request to POJO with interesting methods"/>
    <transformer ref="ClassNameLogger" doc:name="Logs The Class Name of MuleMessage payload"/>
    <!-- <enricher target="#[variable:authorized]">
        <http:outbound-endpoint exchange-pattern="request-response" host="12.34.45.56" port="1234" path="foo/bar" method="GET" disableTransportTransformer="true" 
        responseTransformer-refs="ObjectToString" doc:name="Authorization Service"/>
    </enricher> -->
    <transformer ref="ClassNameLogger" doc:name="Logs The Class Name of MuleMessage payload"/>
    <choice doc:name="Choice">
        <when expression="header:INVOCATION:authorized=true">
            <processor-chain>
                <component class="com.org.MyClass"/>
                <transformer ref="MyObjToString"/>
                <http:response-builder status="200" contentType="text/xml" doc:name="HTTP Response Builder"/>
            </processor-chain>
        </when>
        <when SOMETHING ELSE>
            DO SOMETHING ELSE
        </when>
    </choice>
</sub-flow>

エンリッチャーとセキュリティ フィルターの両方を配置したこのフローは期待どおりに機能せず、ClassNameLogger ステートメントは String、MyRequest、byte[] の順に出力されます。

<custom-transformer class="com.org.HttpRequestToMyRequest" name="HttpRequestToMyRequest" doc:name="Java"/>
<custom-transformer class="com.org.ClassNameLogger" name="ClassNameLogger" doc:name="Java"/>
<flow name="Input_Flow" doc:name="Input_Flow">
        <http:inbound-endpoint exchange-pattern="request-response" host="http://12.23.34.45" port="1234" path="/foo">
            <mule-ss:http-security-filter realm="mule-realm"/>
        </http:inbound-endpoint>
    <flow-ref name="Sorting_Flow" doc:name="Sorting flow"/>
</flow>
<sub-flow name="Sorting_Flow" doc:name="Sorting_Flow">
    <transformer ref="ClassNameLogger" doc:name="Logs The Class Name of MuleMessage payload"/>
    <transformer ref="HttpRequestToMyRequest" doc:name="Transform Http Request to POJO with interesting methods"/>
    <transformer ref="ClassNameLogger" doc:name="Logs The Class Name of MuleMessage payload"/>
    <enricher target="#[variable:authorized]">
        <http:outbound-endpoint exchange-pattern="request-response" host="12.34.45.56" port="1234" path="foo/bar" method="GET" disableTransportTransformer="true" 
        responseTransformer-refs="ObjectToString" doc:name="Authorization Service"/>
    </enricher>
    <transformer ref="ClassNameLogger" doc:name="Logs The Class Name of MuleMessage payload"/>
    <choice doc:name="Choice">
        <when expression="header:INVOCATION:authorized=true">
            <processor-chain>
                <component class="com.org.MyClass"/>
                <transformer ref="MyObjToString"/>
                <http:response-builder status="200" contentType="text/xml" doc:name="HTTP Response Builder"/>
            </processor-chain>
        </when>
        <when SOMETHING ELSE>
            DO SOMETHING ELSE
        </when>
    </choice>
</sub-flow>

編集 2

HttpRequestToMyRequest トランスフォーマーのコード

public class HttpRequestToMyRequest extends AbstractMessageTransformer{
    @Override
    public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {    
    if("/foo".equals(message.getInboundProperty("http.request.path")){
        return new MyFooRequest();
    }
    if("/bar".equals(message.getInboundParameter("http.request.path")){
        return new MyBarRequest();      
    }   
    else return new MyEmptyRequest();
    }
}

編集 3

どうやらこれは Mule 3.3 固有のものでした。3.4 にアップグレードすると、すべてが期待どおりに機能し始めました。

4

1 に答える 1