我试图将一个简单的重定向添加到基于Restlets构建的Web应用程序中,事实证明这很简单。任务很简单:我实际上想将所有丢失的文件从Web应用程序重定向到同一静态文件。

我正在使用具有以下值的org.restlet.routing.Redirector(我正在使用Spring注入):

<bean name="router" class="org.restlet.ext.spring.SpringRouter">
    <constructor-arg ref="trackerComponentChildContext" />
    <property name="attachments">
        <map>
            <entry key="/api" value-ref="apiRouter" />
            <entry key="/statics" value-ref="staticsDirectory" />
            <entry key="/" value-ref="staticsRedirector" />
        </map>
    </property>
</bean>

<bean id="staticsRedirector" class="ca.uhnresearch.pughlab.tracker.restlets.CustomRedirector">
    <constructor-arg ref="trackerComponentChildContext" />
    <constructor-arg value="{o}/statics/index.html" />
    <constructor-arg value="7" />
</bean>


我可以相对简单地处理文件层次结构,但是我只想将与/api/statics不匹配的任何内容发送到同一应用程序中的/statics/index.html

Restlet几乎可以得到它,并且现在看来确实可以提取对正确文件的引用,但是它并没有完全为它服务。

我将整个内容的工作副本(包括下面的Thierry的建议)放在:https://github.com/morungos/restlet-spring-static-files。我想发生的事情类似于下面的等效顺序尝试:

curl http://localhost:8080/statics/**/*击中相应的/statics/**/*

curl http://localhost:8080击中主要/statics/index.html

curl http://localhost:8080/**/*击中主要/statics/index.html

最佳答案

我对您的问题进行了一些测试,但无法弄清楚如何传达您的信息:-(。也许是因为我没有完整的代码。

实际上,我在SpringRouter本身的级别上看到了一个问题。我想使用attachDefault而不是attach("/", ...) / attach("", ...)附加重定向器。方法setDefaultAttachment实际上执行attach("", ...)

因此,我进行了以下更新:


创建自定义SpringRouter

public class CustomSpringRouter extends SpringRouter {
    public void setDefaultAttachment(Object route) {
        if (route instanceof Redirector) {
            this.attachDefault((Restlet) route);
        } else {
            super.setDefaultAttachment(route);
        }
    }
}

创建一个自定义Redirector。我从组件而不是子上下文获得上下文。

public class CustomRedirector extends Redirector {
    public CustomRedirector(Component component, String targetPattern, int mode) {
        super(component.getContext(), targetPattern, mode);
    }
}



然后,我使用以下Spring配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="myComponent" class="org.restlet.ext.spring.SpringComponent">
        <property name="defaultTarget" ref="router" />
    </bean>

    <bean name="router" class="test.CustomSpringRouter">
        <property name="attachments">
            <map>
                <entry key="/api" value-ref="apiRouter" />
                <entry key="/statics" value-ref="staticsDirectory" />
            </map>
        </property>
        <property name="defaultAttachment" ref="staticsRedirector" />
    </bean>

    <bean id="staticsRedirector" class="test.CustomRedirector">
        <constructor-arg ref="myComponent" />
        <constructor-arg value="{o}/statics/index.html" />
        <constructor-arg value="7" />
    </bean>

    <bean name="apiRouter" class="org.restlet.ext.spring.SpringRouter">
        (...)
    </bean>

    (...)
</beans>


希望对您有帮助,
蒂埃里

09-27 05:19