的Restlet - 麻烦附加资源类路由器(Restlet - trouble attaching

2019-07-03 11:11发布

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

在上面的代码,它看到的资源为相对 ,因此改变从所请求的资源/hello完整网址。 我缺少明显的东西在这里,但我完全难倒。

Answer 1:

最后,通过打开日志记录(FINE)找到了解决办法。 我看到这个日志消息:

默认情况下,应用程序应该为了让应用程序的出站根句柄调用适当地连接到一个父组件。

我不完全明白是什么意思(也许我要读文档从开始到结束?)。 安装该应用程序的虚拟主机解决了这一问题:

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


文章来源: Restlet - trouble attaching Resource class with Router