2

我有一个 mule-config 文件,我在其中定义了一个“http 入站”来接受相应 URL 上的请求。

现在我要做的是只接受一个有效的 http 入站地址并拒绝其他地址。

所以我应用了一个“选择”过滤器来过滤掉有效的 URL。(如下所示):

<flow name="abc">
    <http:inbound-endpoint address="http://localhost:1212/jcore/abc" 
transformer-refs="HttpParams" responseTransformer-refs="JavaObjectToJson" 
contentType="application/json" encoding="UTF-8">

    </http:inbound-endpoint>

    <component class="main.java.com.jcore.abc"/>

    <choice>
        <when evaluator="header" 
expression="INBOUND:http.request.path=/jcore/abc/a">

            <vm:outbound-endpoint path="ToSomething"/>

        </when>

         <when evaluator="header" 
expression="INBOUND:http.request.path=/jcore/abc/b">

            <vm:outbound-endpoint path="ToSomething"/>

        </when>

        <otherwise>
            <message-properties-transformer>
                <add-message-property key="http.status" value="404"/>
            </message-properties-transformer>
            <expression-transformer>
                <return-argument evaluator="string" 
expression="{&quot;Exception&quot;: &quot;Could not Render the Request. 
URL may be wrong&quot;}"/>
            </expression-transformer>
        </otherwise>

    </choice>

</flow>

这是工作 ..!!

但我有大约 30 个像这样的“流”。我想在每个流程上应用这样的“选择”过滤器。

注意匹配的 URL 在每种情况下都会发生变化。就像在这种情况下它是“/abc/a”。在其他地方,情况不同

所以,我想知道,是否有一种方法可以避免编写大量冗余代码并使用参数或其他内容制作一个 Spring bean,我可以将其应用于每个流程..??

4

1 回答 1

2

我将路径验证逻辑与实际请求处理逻辑分开,我将通过 flow-ref 构造使其通用、可配置和跨流共享。

像这样的东西:

<flow name="abc">
    <http:inbound-endpoint address="http://localhost:1212/jcore/abc"
        contentType="application/json" encoding="UTF-8" />

    <message-properties-transformer scope="invocation">
        <add-message-property key="supported.request.paths"
                              value="/jcore/abc/a,/jcore/abc/b"/>
    </message-properties-transformer>    
    <flow-ref name="request-handler" />
</flow>

<flow name="request-handler">
    <script:component>
        <script:script engine="groovy">
            def requestPath = message.getInboundProperty('http.request.path')
            def supportedPaths = message.getInvocationProperty('supported.request.paths')
            def requestPathOk = supportedPaths.split(',').toList().contains(requestPath)
            message.setInvocationProperty('request.path.ok', requestPathOk)
            return message
        </script:script>
    </script:component>
    <choice>
        <when evaluator="header" expression="INVOCATION:request.path.ok=true">
            <vm:outbound-endpoint path="ToSomething" exchange-pattern="request-response" />
        </when>
        <otherwise>
            <message-properties-transformer>
                <add-message-property key="http.status" value="404" />
            </message-properties-transformer>
            <expression-transformer>
                <return-argument evaluator="string"
                    expression="{&quot;Exception&quot;: &quot;Could not Render the Request. URL may be wrong&quot;}" />
            </expression-transformer>
        </otherwise>
    </choice>
</flow>
于 2011-12-08T23:58:37.150 回答