【发布时间】:2017-01-23 10:20:31
【问题描述】:
我正在开发一个应用程序,它使用 Pushy 通过 ALPN 访问 HTTP/2 来向 Apple iPhone 发送推送通知。
为此,我已将 JVM 配置为按照以下 VM 参数的要求使用 ALPN。
-Xbootclasspath/p:<Path To ALPN JAR>
与 Apple Push Notification Server 的连接工作正常。
但是在同一个应用程序中,我有一个 MSSQL 数据源通过 MSSQL Jdbc 驱动程序连接到数据库。但是当它尝试连接到 MSSQL 时会抛出以下错误:
java.lang.IllegalAccessError: tried to access field sun.security.ssl.Handshaker.algorithmConstraints from class sun.security.ssl.ClientHandshaker
谁能帮我解决这个问题或指出正确的方向。
全栈跟踪
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalAccessError: tried to access field sun.security.ssl.Handshaker.algorithmConstraints from class sun.security.ssl.ClientHandshaker
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
... 58 more
Caused by: java.lang.IllegalAccessError: tried to access field sun.security.ssl.Handshaker.algorithmConstraints from class sun.security.ssl.ClientHandshaker
at sun.security.ssl.ClientHandshaker.serverKeyExchange(ClientHandshaker.java:778)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:285)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:969)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:904)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1050)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375)
at com.microsoft.sqlserver.jdbc.TDSChannel.enableSSL(IOBuffer.java:1618)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1323)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:991)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827)
at com.microsoft.sqlserver.jdbc.SQLServerDataSource.getConnectionInternal(SQLServerDataSource.java:621)
at com.microsoft.sqlserver.jdbc.SQLServerDataSource.getConnection(SQLServerDataSource.java:57)
at com.zaxxer.hikari.pool.BaseHikariPool.addConnection(BaseHikariPool.java:373)
at com.zaxxer.hikari.pool.BaseHikariPool.initializeConnections(BaseHikariPool.java:469)
at com.zaxxer.hikari.pool.BaseHikariPool.<init>(BaseHikariPool.java:162)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:61)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:49)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:78)
删除 VM 参数修复了数据源问题,但 ALPN 连接失败。
更新
Jetty 的 ALPN-Boot 库将覆盖包 sun.security.ssl
这在 jsse.jar 中也可用(这意味着是 JVM 核心类)
这种覆盖会使数据源失败,因为 MSSQL Server 不是 HTTP2 服务器
这就是我得到的原因
java.lang.IllegalAccessError: tried to access field sun.security.ssl.Handshaker.algorithmConstraints from class sun.security.ssl.ClientHandshaker
有没有我可以同时使用 HTTP2 和 HTTP?
【问题讨论】:
-
这个答案有帮助吗? stackoverflow.com/questions/32401050/…
-
@FrederikDeweerdt 感谢您的评论,但这不是解决方案。因为我必须从同一代码访问 HTTP2 和 HTTP 服务器。
标签: java sql-server netty http2 pushy