Java 来自apache httpclient代码的神秘ClasscastException
我们在项目中使用Apache的commons-httpclient-3.1库。但是,由于遗留和其他特定于项目的依赖关系,我们没有使用Apache提供的SecureProtocolSocketFactory接口的任何实现(如SSLProtocolSocketFactory、StrictSSLProtocolSocketFactory)我们已经创建了自己的SocketFactory,名为HttpClient3xSocketFactory,它实现了SecureProtocolSocketFactory接口。该工厂通过调用org.Apache.commons.httpclient.Protocol.Protocol.java的Protocol.registerProtocol方法向Apache注册。下面给出了我们的代码片段Java 来自apache httpclient代码的神秘ClasscastException,java,apache,exception-handling,classcastexception,Java,Apache,Exception Handling,Classcastexception,我们在项目中使用Apache的commons-httpclient-3.1库。但是,由于遗留和其他特定于项目的依赖关系,我们没有使用Apache提供的SecureProtocolSocketFactory接口的任何实现(如SSLProtocolSocketFactory、StrictSSLProtocolSocketFactory)我们已经创建了自己的SocketFactory,名为HttpClient3xSocketFactory,它实现了SecureProtocolSocketFactory
public class HttpClient3xSocketFactory implements SecureProtocolSocketFactory {
. . .
private static final ProtocolSocketFactory socketFactory = new HttpClient3xSocketFactory();
private static final Protocol httpsProto = new Protocol("https",
socketFactory, 443);
并登记如下
Protocol.registerProtocol("https", httpsProto);
然而,这从Apache的HttpConnection的tunnelCreated()方法的最后一行生成了一个神秘的ClasscastException
if (usingSecureSocket) {
throw new IllegalStateException("Already using a secure socket");
}
if (LOG.isDebugEnabled()) {
LOG.debug("Secure tunnel to " + this.hostName + ":" + this.portNumber);
}
SecureProtocolSocketFactory socketFactory =
(SecureProtocolSocketFactory) protocolInUse.getSocketFactory();
例外情况是--
但是com.vmware.vdi.common.saml.HttpClient3xSocketFactory确实实现了org.apache.commons.httpclient.protocolsecuresocketfactory接口。已经使用GetClassLoader方法验证了这两个类都是使用相同的类加载器加载的。在运行时还使用反射检查com.vmware.vdi.common.saml.HttpClient3xSocketFactory是否实际实现了org.apache.commons.httpclient.protocolsocketfactory接口。因此,我无法理解为什么会生成ClassCaseException
Caused by: java.lang.ClassCastException: com.vmware.vdi.common.saml.HttpClient3xSocketFactory cannot be cast to org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory
at org.apache.commons.httpclient.HttpConnection.tunnelCreated(HttpConnection.java:791)
at org.apache.commons.httpclient.HttpMethodDirector.executeConnect(HttpMethodDirector.java:528)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:404)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:178)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:408)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:327)