何时使用Restlet路由器v。具有多个路由的组件

时间:2013-05-06 23:06:14

标签: 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());

我的心跳代码有效。

但是当我使用路由器作为上面的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);

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

实际上,使用基于路由器的代码会产生与命中不存在的URL相同的效果。

所以我问:

  1. 基于路由器的方法应该实现什么与基于组件的方法有什么区别?
  2. 我可以使用基于路由器的方法使用此代码吗?截至目前,我唯一的解决方案是废弃多个路由器并改为连接多个组件,这需要处理更多遗留代码。

1 个答案:

答案 0 :(得分:1)

我无法在虚拟主机附件上看到任何问题,因为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());

在这种情况下,所有以pair.uriPattern值开头的请求都将由路由器处理。所以路由器的定义应该是这样的:

Router router = new Router();
router.attach("/something", yourRestlet1);
router.attach("/somethingelse", yourRestlet2);

在这种情况下,我们将有以下行为:

  • 路线pair.uriPattern + "/something"将使用yourRestlet1
  • 处理
  • 路线pair.uriPattern + "/somethingelse"将使用yourRestlet2
  • 处理

事实上,这种方法是组织应用程序代码的好方法。

希望它可以帮到你, 亨利