Restlet – 使用Router附加Resource类时出现问题

使用Restlet 2.1.0,Java SE版本进行原型设计,我无法将ServerResource类映射到URL。 我使用Router.attach方法尝试了很多变种,但没有任何效果。

我当前的代码如下所示:

/** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { final Router router = new Router(); router.attach("/hello", FirstServerResource.class); router.attach("/json", Json.class); Application myApp = new Application() { @Override public org.restlet.Restlet createInboundRoot() { router.setContext(getContext()); return router; }; }; new Server(Protocol.HTTP, 8182, myApp).start(); } 

当我浏览到http://localhost:8182/hello它没有正确匹配模板。 通过源代码调试,我看到会发生的情况是匹配逻辑将请求的资源视为http://localhost:8182/hello而不仅仅是/hello 。 发生这种情况的Restlet代码在这里:

 // HttpInboundRequest.java // Set the resource reference if (resourceUri != null) { setResourceRef(new Reference(getHostRef(), resourceUri)); if (getResourceRef().isRelative()) { // Take care of the "/" between the host part and the segments. if (!resourceUri.startsWith("/")) { setResourceRef(new Reference(getHostRef().toString() + "/" + resourceUri)); } else { setResourceRef(new Reference(getHostRef().toString() + resourceUri)); } } setOriginalRef(getResourceRef().getTargetRef()); } 

在上面的代码中,它将Resource视为相对 ,因此将请求的资源从/hello更改为完整的url。 我在这里遗漏了一些明显的东西,但我完全难过了。

最后通过打开日志记录(FINE)找到了解决方案。 我看到了这条日志消息:

默认情况下,应将应用程序附加到父组件,以便让应用程序的出站根句柄正确处理。

我不完全理解它的意思(也许我必须阅读文档开始完成?)。 将应用程序附加到VirtualHost解决了以下问题:

 public static void main(String[] args) throws Exception { final Router router = new Router(); router.attach("/hello", FirstServerResource.class); router.attach("/json", Json.class); router.attachDefault(Default.class); Application myApp = new Application() { @Override public org.restlet.Restlet createInboundRoot() { router.setContext(getContext()); return router; }; }; Component component = new Component(); component.getDefaultHost().attach("/test", myApp); new Server(Protocol.HTTP, 8182, component).start(); }