【问题标题】:Authentication interfers with enricher in Mule 3.3身份验证干扰 Mule 3.3 中的丰富器
【发布时间】:2013-08-02 23:13:18
【问题描述】:

我目前正在编写一个使用基本身份验证的相当简单的 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[] 转换为 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>

这个流程,我已经注释掉了浓缩器,按预期工作,除了它没有进入选择,因为浓缩器设置的变量没有定义。 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,一切都开始按预期工作。

【问题讨论】:

  • 我看到您使用旧式表达式语法:您使用的是哪个 Mule 版本?
  • 我正在使用 Mule 3.3.0 但这只是因为我没有时间更新到 3.4。如果我使用旧语法或奇怪的结构,那是因为我对 Mule 比较陌生,所以非常感谢任何指针:)

标签: mule esb


【解决方案1】:

对于 Mule 3.4,我注意到带有或不带有 http-security-filter 元素的有效负载类型没有区别。

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

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

【讨论】:

  • 也许我不清楚......到目前为止我只使用了 GET 请求,所以在 HttpRequestToMyRequest 转换器之前,有效负载始终是字符串。在转换器之后,有效负载是 MyRequest 类型的 POJO。然后在浓缩器之后但在选择有效负载之前突然是字符串 com.org.MyRequest@15ae9009 作为字节 []。虽然如果我注释掉安全过滤器,那么丰富器之后的有效负载仍然是一个类型为 MyRequest 的 POJO,并且一切正常。
  • 感谢您的精确。我可以假设HttpRequestToMyRequest 只注册java.lang.String 作为它的源类型和com.org.MyRequest 作为它的返回数据类型?您还可以分享HttpRequestToMyRequest 是如何在 XML 中配置的吗?另请指定此变压器的基类。最后为什么要使用这么旧版本的Mule?如果您应该使用 3.3,至少使用 3.3.1 而不是 3.3.0 来修复一些重要的错误。
  • 是的 HttpRequestToMyRequest 只注册了 String 作为源,MyRequest 作为返回类型并扩展了 AbstractTransformer。从那以后,我将其更改为 AbstractMessageTransformer 只是为了确定它是否有所作为,但事实并非如此。至于如何在 XML 中配置转换器,我在原帖顶部添加了额外的一行。
  • 虽然我不认为 HttpRequestToMyRequest 转换器与问题有任何关系,请参阅我上面的编辑以获得更多说明。
  • Mule 中的任何细节都很重要,因为有许多可能的交互和副作用。可以分享一下HttpRequestToMyRequest的代码吗?
猜你喜欢
  • 2018-03-24
  • 2012-03-29
  • 1970-01-01
  • 2018-04-02
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
相关资源
最近更新 更多