Jetty-9 HTTP/2 в контейнере OSGi. Не удается загрузить реализацию HttpFieldPreEncoder для HTTP / 2 через ServiceLoader

В последнее время я пытаюсь вызвать REST-сервис, опубликованный поверх Apache-CXF. Все встроено в Equinox 3.11.0 с Jetty 9.4.1.

Контейнер запускает Jetty, настроенный для HTTP/2: [main] INFO org.eclipse.jetty.server.Server - jetty-9.4.1.v20170120 [main] INFO org.eclipse.jetty.server.handler.ContextHandler - запущен oejsServletContextHandler@6f89f665{/,jar:file:///C:/workspaces/com.ebase.eox/cnf/generated/fw/org.eclipse.osgi/12/0/bundleFile!/,AVAILABLE} [main] ИНФОРМАЦИЯ орг.eclipse.jetty.server.AbstractConnector - запущенный 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(мол,h=[],w=[]) для SslContextFactory@4fe01803(bundleentry://12.fwk1276261147/jettyhome/etc/keystore,bundleentry://12.fwk1276261147/jettyhome/etcke/ main] INFO org.eclipse.jetty.server.AbstractConnector - запущен ServerConnector@3015db78{SSL,[ssl, alpn, h2, http/1.1]}{0.0.0.0:8443}

Когда я вызываю REST-сервис через https/ssl, я получаю сообщение об ошибке: Причина: java.lang.ArrayIndexOutOfBoundsException: 1 at org.eclipse.jetty.http.PreEncodedHttpField.putTo(PreEncodedHttpField.javag:11): 9) jetty.http2.hpack.HpackEncoder.encode(HpackEncoder.java:289) в org.eclipse.jetty.http2.hpack.HpackEncoder.encode(HpackEncoder.java:179) в org.eclipse.jetty.http2.generator.generateHeaders(HeadersGenerator.java:72) в org.eclipse.jetty.http2.generator.HeadersGenerator.generate(HeadersGenerator.java:56) в org.eclipse.jetty.http2.generator.Generator.control(Generator.java:80) в org.eclipse.jetty.http2.HTTP2Session$ControlEntry.generate(HTTP2Session.java:1143) в org.eclipse.jetty.http2.HTTP2Flusher.process(HTTP2Flusher.java:168) в org.eclipse.jetteC.processing(IteratingCallback.java:241) в org.eclipse.jetty.util.IteratingCallback.iterate(IteratingCallback.java:224) в org.eclipse.jetty.http2.HTTP2Session.frame(HTTP2Session.java:676) в или g.eclipse.jetty.http2.HTTP2Session.frames(HTTP2Session.java:648) в org.eclipse.jetty.http2.HTTP2Stream.headers(HTTP2Stream.java:91) в org.eclipse.jetty.http2.server.OTPTHT commit(HttpTransportOverHTTP2.java:185) в org.eclipse.jetty.http2.server..eclipse.jetty.server.HttpChannel.write(HttpChannel.java:743) в org.eclipse.jetty.server.HttpOutput.write(HttpOutput.java:234) в org.eclipse.jetty.server.HwutputOutput.java:218) ... еще 61

Кажется (я доказал это), что PreEncodedHttpField не может загрузить все реализации HttpFieldPreEncoder через ServiceLoader.

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

ServiceLoader видит только Http1FieldPreEncoder, который находится в том же Bundle, что и PreEncodedHttpField, так что его можно наблюдать для BundleClassLoader. Эта реализация зарегистрирована под индексом "0".

В моем случае следует использовать HTTP / 2-реализацию HpackFieldPreEncoder, которая входит в пакет http2-hpack, но не видна для ServiceLoader.

Есть ли обходной путь, чтобы сделать эту вторую реализацию видимой для PreEncodedHttpField, чтобы избежать моего исключения?

Спасибо

0 ответов

Другие вопросы по тегам