身份验证干扰了Mule 3.3的丰富

时间:2013-07-29 12:41:59

标签: mule esb

我目前正在编写一个使用基本身份验证的相当简单的mule-flow

<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 []转换为String,那么它原来是MyRequest的实例名称(com.org.MyRequest@15ae9009)。

任何帮助或想法将不胜感激。

修改

要清楚。这里有三个流xml片段,其中两个表现良好,最后一个表现出我不理解的奇怪行为。

此流程,我已注释掉入站端点上的安全过滤器,按预期工作,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>

这个流程,我已经注释掉了richher,它按预期工作,除了它没有进入选择的事实,因为没有定义由richr设置的变量。 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>

这个我同时使用richher和security-filter的流程没有按预期工作,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,一切都按预期开始工作。

1 个答案:

答案 0 :(得分:0)

使用Mule 3.4,我注意到有或没有http-security-filter元素的有效载荷类型没有区别。

如果请求是HTTP GET,则为java.lang.String;如果是POST或PUT,则为java.io.InputStream

由于您使用的是3.3,因此我可能会遇到3.4中没有的错误,因为我没有任何问题。如果是这种情况,那么在3.3上找到问题的解决方法将是多毛的:升级到3.4是前进的道路。