我试图将一个简单的重定向添加到基于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>
希望对您有帮助,
蒂埃里