如何从Mule入站端点中的一组URI中过滤单个URI?

时间:2012-07-07 02:00:58

标签: java spring jersey mule

我有以下代码在“http:// localhost:8080 / alpha”配置Jersey服务:

*** my mule config ***

<flow name="flow1">
    <inbound-endpoint address="http://localhost:8080/" exchange-pattern="request-response"    />
<jersey:resources>
    <component>
        <singleton-object class="com.address.Flow1Resource"/>
    </component>
</jersey:resources>
</flow>

*** Flow1Resource.java ***

@Path("/alpha")
public class Flow1Resource {...}

我想添加一个新的入站端点,它处理“http:// localhost:8080”下的所有地址,“http:// localhost:8080 / alpha”除外(例如“http:// localhost:8080 /测试版“)。这些新地址需要单个球衣资源。例如:

*** my mule config ***

<flow name="flow1">
    <inbound-endpoint address="http://localhost:8080/" exchange-pattern="request-response"    />
<jersey:resources>
    <component>
        <singleton-object class="com.address.Flow1Resource"/>
    </component>
</jersey:resources>
</flow>

<flow name="flow2">
    <inbound-endpoint address="http://localhost:8080/*" exchange-pattern="request-response"    />
<jersey:resources>
    <component>
        <singleton-object class="com.address.Flow2Resource"/>
    </component>
</jersey:resources>
</flow>

*** Flow1Resource.java ***

@Path("/alpha")
public class Flow1Resource {...}

*** Flow2Resource.java ***

@Path("/")
public class Flow2Resource {
    @Path("beta")
    public void beta() {...}
    @Path("gamma")
    public void gamma() {...}
    ...
}

如何设置mule inbound-endpoint以捕获所有地址(即beta&amp; gamma),但特定网址(即alpha)除外。

我知道我可以对mule配置中的路径进行硬编码,但这会导致重复,因为每个地址(即beta&amp; gamma)都需要自己的流和资源代码,这些代码类似。

请注意,我在上面的代码中使用了“http:// localhost:8080 / *”作为概念示例。它不起作用。

---更新---

我忘了提及beta和gamma uri也有使用它们的安全性:

<http:inbound-endpoint ...>
    <spring-security:http-security-filter realm="mule-realm"/>
</http:inbound-endpoint>

我尝试向端点添加'choice'元素,但它抱怨spring-security在选择决策结构中无效。

解决方案还需要适应此功能。

1 个答案:

答案 0 :(得分:0)

实现目标的一种简单方法是将您的流量合并为一个并使用选择路由器。在此配置中,您的流程将如下所示:

<flow name="stackoverflowFlow1" doc:name="stackoverflowFlow1">
    <http:inbound-endpoint exchange-pattern="request-response"
        host="localhost" port="8081" doc:name="HTTP" />
    <logger level="ERROR" />
    <choice doc:name="Choice">
        <when expression="#[message.inboundProperties['http.request'] == '/']">
            <processor-chain>
                <logger message="/ invoked " level="ERROR" />
                <jersey:resources doc:name="REST">
                    <component class="Resource" />
                </jersey:resources>
            </processor-chain>
        </when>
        <otherwise>
            <processor-chain>
                <logger message="otherwise invoked " level="ERROR" />

                <jersey:resources doc:name="REST">
                    <component class="ApplicationsResource" />
                </jersey:resources>
            </processor-chain>
        </otherwise>
    </choice>
</flow>

您可以想象,您可以对路径或任何其他http标头进行决策。

您可以找到此路由器文档here以及可用于做出选择的最常见http属性列表here