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

时间:2012-10-30 21:22:38

标签: java rest restlet

使用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());
}

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

1 个答案:

答案 0 :(得分:4)

最后通过打开日志记录(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();
}