java - 何时使用 ReSTLet router v. Component with multiple routes

标签 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 文档仅给出了使用具有 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. 我可以使用基于路由器的方法让这段代码工作吗?到目前为止,我唯一的解决方案是废弃多个路由器并改为附加多个组件,这需要处理更多遗留代码。

最佳答案

我看不出在虚拟主机附件上使用路由器有任何问题,因为 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 处理

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

希望对你有帮助, 蒂埃里

关于java - 何时使用 ReSTLet router v. Component with multiple routes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16408706/

相关文章:

java - hibernate 中延迟加载对象属性的限制

使用 Jackson 读取 csv 时的 Java 过滤器值

java - 如何在 HttpSession 中存储 Java 对象?

java - 迭代结果集键 - 这可能吗?

java - 如何将 reSTLet 附加到特定的 URL 路径方案(HTTP 或 HTTPS)?

java-基于If语句声明数组

java - 如何使用selenium从谷歌翻译获取翻译后的文本?

tomcat - 我如何在 servlet 之间共享 session 状态?

java - Java 新手请help.form n servlet

java - 从 ReSTLet 请求中读出自定义 header