Jetty:如何嵌套HandlerWrapper,HandlerList和ContextHandlerCollection,以及ContextHandler

时间:2016-08-27 00:00:37

标签: java jetty embedded-jetty

我正在尝试在Jetty上构建一个api服务器。

我希望在看起来像/ apis / api1 / endpoint,/ apis / api2 / endpoint,/ apis / api3 / endpoint等的路由上有多个api

基本上我有一个HandlerWrapper,它包含一个ContextHandlerCollections的HandlerList,实质上就是这样:

public void handle(...) {
    if (uri.startsWith("/apis/")) {
        log.info("This is an api request");
        this.getHandlerList.handle(...)
    } else {
        super.handle()
    }
}

private HandlerList getHandlerList() {
    HandlerList handlerList = new HandlerList();
    ContextHandlerCollection contextHandlerCollection = new ContextHandlerCollection();
    ContextHandler api1 = new ContextHandler("/apis/api1/endpoint");
    api1.setHandler(new Api1Handler());
    contextHandlerCollection.addHandler(api1);
    handlerList.addHandler(contextHandlerCollection);
    return handlerList
}

现在我试着这样做:

curl localhost:port/apis/api1/endpoint

我找不到404,但我在日志中看到声明“这是一个api请求”。

任何提示?

我基本上每个api1,api2等都需要一个ContextHandlerCollection。而ContextHandlerCollection应该由一组特定于端点的处理程序组成。

我错过了什么?

干杯,

1 个答案:

答案 0 :(得分:3)

Handler - 处理请求的基本形式,它不是请求处理的终点,除非您致电request.setHandled(true)

HandlerWrapper - 一个可以执行某些处理并决定是否应该将请求移交给嵌套(包装)处理程序的处理程序。

HandlerCollection - 处理程序的集合,遵循有关执行顺序的标准java集合规则。系统中的每个处理程序都会执行,直到其中一个处理程序调用{​​{1}}

request.setHandled(true) - 一个专门的HandlerCollection,遵循java.util.List执行子处理程序的顺序

HandlerList - 一个专门的HandlerWrapper,只有在请求上下文路径和虚拟主机匹配时才执行其包装的Handler。

ContextHandler - ContextHandlerCollection的HashMap,它只执行那些与请求上下文路径(和虚拟主机)匹配的子处理程序(在集合中)