OSGi容器中的Jetty-9 HTTP / 2。无法通过ServiceLoader加载HTTP / 2的HttpFieldPreEncoder实现

时间:2017-01-26 09:42:57

标签: osgi http2 jetty-9 serviceloader

最近我正在尝试调用通过Apache-CXF发布的REST服务。所有内容都嵌入在带有Jetty 9.4.1的Equinox 3.11.0中。

Container启动Jetty,为HTTP / 2配置:

[main] INFO org.eclipse.jetty.server.Server - jetty-9.4.1.v20170120
[main] INFO org.eclipse.jetty.server.handler.ContextHandler - Started o.e.j.s.ServletContextHandler@6f89f665{/,jar:file:///C:/workspaces/com.ebase.eox/cnf/generated/fw/org.eclipse.osgi/12/0/bundleFile!/,AVAILABLE}
[main] INFO org.eclipse.jetty.server.AbstractConnector - Started ServerConnector@187eb9a8{HTTP/1.1,[http/1.1, h2c]}{0.0.0.0:8080}
[main] INFO org.eclipse.jetty.util.ssl.SslContextFactory - x509=X509@1517f633(jetty,h=[],w=[]) for SslContextFactory@4fe01803(bundleentry://12.fwk1276261147/jettyhome/etc/keystore,bundleentry://12.fwk1276261147/jettyhome/etc/keystore)
[main] INFO org.eclipse.jetty.server.AbstractConnector - Started ServerConnector@3015db78{SSL,[ssl, alpn, h2, http/1.1]}{0.0.0.0:8443}

Wenn我通过https / ssl调用REST服务我收到错误:

Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
    at org.eclipse.jetty.http.PreEncodedHttpField.putTo(PreEncodedHttpField.java:119)
    at org.eclipse.jetty.http2.hpack.HpackEncoder.encode(HpackEncoder.java:289)
    at org.eclipse.jetty.http2.hpack.HpackEncoder.encode(HpackEncoder.java:179)
    at org.eclipse.jetty.http2.generator.HeadersGenerator.generateHeaders(HeadersGenerator.java:72)
    at org.eclipse.jetty.http2.generator.HeadersGenerator.generate(HeadersGenerator.java:56)
    at org.eclipse.jetty.http2.generator.Generator.control(Generator.java:80)
    at org.eclipse.jetty.http2.HTTP2Session$ControlEntry.generate(HTTP2Session.java:1143)
    at org.eclipse.jetty.http2.HTTP2Flusher.process(HTTP2Flusher.java:168)
    at org.eclipse.jetty.util.IteratingCallback.processing(IteratingCallback.java:241)
    at org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:224)
    at org.eclipse.jetty.http2.HTTP2Session.frame(HTTP2Session.java:676)
    at org.eclipse.jetty.http2.HTTP2Session.frames(HTTP2Session.java:648)
    at org.eclipse.jetty.http2.HTTP2Stream.headers(HTTP2Stream.java:91)
    at org.eclipse.jetty.http2.server.HttpTransportOverHTTP2.commit(HttpTransportOverHTTP2.java:185)
    at org.eclipse.jetty.http2.server.HttpTransportOverHTTP2.send(HttpTransportOverHTTP2.java:111)
    at org.eclipse.jetty.server.HttpChannel.sendResponse(HttpChannel.java:687)
    at org.eclipse.jetty.server.HttpChannel.write(HttpChannel.java:743)
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:234)
    at org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:218)
    ... 61 more

似乎(我已经证明了), PreEncodedHttpField 无法加载 ServiceLoader 上的所有HttpFieldPreEncoder实现。

    Iterator<HttpFieldPreEncoder> iter = ServiceLoader.load(HttpFieldPreEncoder.class,PreEncodedHttpField.class.getClassLoader()).iterator();

ServiceLoader只能看到 Http1FieldPreEncoder ,它与 PreEncodedHttpField 位于同一个Bundle中,因此可以观察到BundleClassLoader。此实现在索引“0”下注册。

在我的情况下,它应该使用HTTP / 2实现 HpackFieldPreEncoder ,它绑定在http2-hpack中,但 ServiceLoader

不可见

是否有任何解决方法可以使第二个实现对PreEncodedHttpField可见以避免我的异常?

谢谢

0 个答案:

没有答案