玻璃鱼5.0 java.lang.NoSuchMethodError

3

当我尝试连接谷歌自定义搜索API时,Glassfish会抛出NoSuchMethodError错误。

以下是代码:

private int conn (String search)throws Exception {

    String key="mykey";
    URL url = new URL("https://www.googleapis.com/customsearch/v1?q="+search+"&cx=017576662512468239146%3Aomuauf_lfve&key="+key);
    doTrustToCertificates();
    HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
    connection.setDoOutput(true);
    BufferedReader reader = new BufferedReader(new InputStreamReader((connection.getInputStream())));
    String splitreader = "";
    StringBuilder ss = new StringBuilder();
    while((splitreader = reader.readLine()) != null){
        ss.append(splitreader);
}
    JSONObject json = new JSONObject(ss.toString());
    JSONObject jsonrequest = json.getJSONObject("queries").getJSONArray("request").getJSONObject(0);
    return jsonrequest.getInt("totalResults");
    }


 public void doTrustToCertificates() throws Exception {
    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
    TrustManager[] trustAllCerts = new TrustManager[]{
            new X509TrustManager() {
                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }

                public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                    return;
                }

                public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                    return;
                }
            }
    };

    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    HostnameVerifier hv = new HostnameVerifier() {
        public boolean verify(String urlHostName, SSLSession session) {
            if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
                System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
            }
            return true;
        }
    };
    HttpsURLConnection.setDefaultHostnameVerifier(hv);
}

异常

java.lang.NoSuchMethodError: sun.security.ssl.SSLSessionImpl.(Lsun/security/ssl/ProtocolVersion;Lsun/security/ssl/CipherSuite;Ljava/util/Collection;Lsun/security/ssl/SessionId;Ljava/lang/String;I)V

但这段代码可以在Glassfish 4.1.1和Wildfly上运行,我不明白为什么在Glassfish 5.0上不能运行。

1个回答

5

检查你的Java版本。这是由于JDK在JDK 8u161左右的更改影响了Grizzly。

总结一下:

  • 如果您使用GlassFish 5.0,则需要使用JDK 8 低于 JDK 8u161的版本
  • 如果您使用GlassFish 5.0.1或更高版本,则需要使用JDK 8 高于 8u161的版本

此错误已在GlassFish GitHub问题跟踪器中跟踪:
https://github.com/eclipse-ee4j/glassfish/issues/22436


5.0.1版的夜间构建似乎没有有效的证书。您需要将cacerts.jks和keystore.jks从5.0版本复制到您的5.0.1域配置中,例如glassfish5/glassfish/domains/domain1/config/ - aaronvargas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接