2013-07-29 28 views
1

我目前正在寫一個使用基本身份驗證認證interfers與富集在騾子3.3

<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安全過濾器,然後這個流程按預期工作和有效載荷在MuleMessage中是由HttpRequestToMyRequest變換器返回的MyRequest類型。但是,一旦我添加安全過濾器,濃縮器將我的有效負載從預期類型更改爲一個字節[]。如果我將字節[]轉換爲字符串,那麼事實證明是MyRequest的實例名稱([email protected])。

任何幫助或想法,將不勝感激。

編輯

只要是明確的。這裏有三個流xml片段,其中兩個表現良好,最後一個有我不明白的奇怪行爲。

此流程中,我已將註釋入站端點上的安全篩選器註釋掉,按預期工作,並按順序打印出StringName,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> 

這種流動,在那裏我已經註釋掉濃縮塔,從事實,因爲由濃縮塔設置的變量沒有定義它不進入的choise正常工作,一邊。 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報表打印出來,從而,字符串,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> 

編輯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

代碼顯然,這是一件騾子3.3具體。一旦我升級到3.4,一切開始按預期工作。

+0

我看到你使用舊式表達式語法:你使用的是什麼Mule版本? –

+0

我使用的是Mule 3.3.0,但那僅僅是因爲我沒有得到更新到3.4。如果我使用舊的語法或怪異的結構,這是因爲我對Mule很陌生,所以任何指針都非常感謝:) – Spade

回答

0

對於Mule 3.4,我注意到有或沒有http-security-filter元素的有效載荷類型的差異。

如果請求是HTTP GET,它可以是java.lang.String,如果是POST或PUT,它可以是java.io.InputStream

因爲你在3.3上,所以你可能會碰到一個3.4中沒有的bug,因爲我沒有任何問題。如果是這樣的話,在3.3上找到問題的解決方法將是毛茸茸的:升級到3.4是前進的道路。

+0

Maybee我不清楚......我只使用GET請求,所以有效載荷總是String直到HttpRequestToMyRequest轉換器。在變換器之後,有效載荷是MyRequest類型的POJO。然後,在richiser之後但在選擇之前,有效載荷突然間是字符串[email protected]作爲byte []。雖然如果我註釋掉安全過濾器,那麼在richter仍然是類型爲MyRequest的POJO並且一切正常的情況下,該有效負載仍然是有效的。 – Spade

+0

感謝您的精確度。我可以假設'HttpRequestToMyRequest'只註冊'java.lang.String'作爲它的源類型,'com.org.MyRequest'作爲它的返回數據類型嗎?你也可以分享如何在XML中配置'HttpRequestToMyRequest'?也請說明該變壓器的基本類別。最後爲什麼使用這樣一箇舊版本的Mule?如果你至少應該使用3.3.1而不是3.3.0來獲得一些重要的bug修復。 –

+0

是HttpRequestToMyRequest只註冊String作爲源和MyRequest作爲返回類型和擴展AbstractTransformer。從那時起,我將它改爲AbstractMessageTransformer,只是爲了讓它有所作爲,但事實並非如此。至於如何用XML配置變壓器,我在原始文章的頂部添加了一行。 – Spade