Question

J'ai un fichier-config mule où j'ai défini un « http entrant » pour accepter la demande sur l'URL correspondante.

Maintenant, ce que je dois à est d'accepter seulement une http adresse valide d'arrivée et de rejeter les autres.

J'ai donc appliqué un filtre « choix » pour filtrer URL valide de. (Comme ce qui suit):

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

Il travaille .. !!

Mais j'ai environ 30 « flux » comme celui-ci. Et je veux appliquer le filtre de « choix » comme celui-ci sur tous les flux.

Remarque : l'URL correspondante va se changer dans chaque cas. Comme dans ce cas, il est « / abc / a ». Dans d'autres, il est différent

Alors, je voulais savoir, s'il y a un moyen d'éviter d'écrire une grande partie de ce code redondant et faire un grain de printemps avec des paramètres ou Sumthing autre, que je peux appliquer sur chaque flux .. ??

Était-ce utile?

La solution

Je sépare la logique de validation de chemin d'accès de la demande réelle logique de manipulation, que je vais faire générique, configurable et partagée entre les flux par l'intermédiaire d'une construction d'écoulement ref.

Quelque chose comme ceci:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top