【问题标题】:Restlet - trouble attaching Resource class with RouterRestlet - 使用路由器附加资源类时出现问题
【发布时间】:2012-10-30 21:22:38
【问题描述】:

使用 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 更改为完整的url。我在这里遗漏了一些明显的东西,但我完全被难住了。

【问题讨论】:

    标签: java rest restlet


    【解决方案1】:

    终于通过开启日志(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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-08
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多