dje*_*lin 5 java servlets restlet
我使用此代码创建了多个路径和组件:
Component component = new Component();
component.getServers().add(Protocol.HTTP, port);
component.getDefaultHost().attach(pair.uriPattern, pair.restlet);
component.getDefaultHost().attach("/heartbeat", new HeartbeatRestlet());
Run Code Online (Sandbox Code Playgroud)
我的心跳代码有效.
但是当我使用路由器时pair.restlet,它不起作用:
Router router = new Router();
Restlet fooHandler = new FooRouter();
Restlet barHandler = new BarRouter();
router.attach("/foo/{fooId}", fooHandler);
router.attach("/bar/{barId1}/{barId2}", barHandler);
Run Code Online (Sandbox Code Playgroud)
Restlet doc仅给出了使用Application类的路由器的示例:
public class FirstStepsApplication extends Application {
@Override
public synchronized Restlet createInboundRoot() {
Router router = new Router(getContext());
router.attach("/hello", HelloWorldResource.class);
return router;
}
}
Run Code Online (Sandbox Code Playgroud)
实际上使用我的基于路由器的代码会产生与命中不存在的URL相同的效果.
所以我问:
我看不出在虚拟主机附件上使用路由器有任何问题,因为 Restlet 允许组合元素来构建请求处理链。
这里的问题是路由器可以支持多个路由,并且您使用精确匹配模式(实际上是默认模式)。
我们来举个例子。如果pair.uriPattern包含/test并且您在此路由上连接了路由器。/test无论您在路由器上指定什么,都只会处理路径(空路由除外;-)
我猜你想实现子路由匹配,所以你应该考虑在将路由器附加到虚拟主机时使用开头匹配:
Router router = (...)
Component component = new Component();
component.getServers().add(Protocol.HTTP, port);
component.getDefaultHost()
.attach(pair.uriPattern, router)
.setMatchingMode(Template.MODE_STARTS_WITH);
component.getDefaultHost().attach("/heartbeat", new HeartbeatRestlet());
Run Code Online (Sandbox Code Playgroud)
在这种情况下,所有以 的值开头的请求都pair.uriPattern将由路由器处理。所以路由器应该这样定义:
Router router = new Router();
router.attach("/something", yourRestlet1);
router.attach("/somethingelse", yourRestlet2);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们会有以下行为:
pair.uriPattern + "/something"将被处理yourRestlet1pair.uriPattern + "/somethingelse"将被处理yourRestlet2事实上,这种方法是组织应用程序代码的好方法。
希望它对你有帮助,蒂埃里
| 归档时间: |
|
| 查看次数: |
1072 次 |
| 最近记录: |