Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 来自apache httpclient代码的神秘ClasscastException_Java_Apache_Exception Handling_Classcastexception - Fatal编程技术网

Java 来自apache httpclient代码的神秘ClasscastException

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

我们在项目中使用Apache的commons-httpclient-3.1库。但是,由于遗留和其他特定于项目的依赖关系,我们没有使用Apache提供的SecureProtocolSocketFactory接口的任何实现(如SSLProtocolSocketFactory、StrictSSLProtocolSocketFactory)我们已经创建了自己的SocketFactory,名为HttpClient3xSocketFactory,它实现了SecureProtocolSocketFactory接口。该工厂通过调用org.Apache.commons.httpclient.Protocol.Protocol.java的Protocol.registerProtocol方法向Apache注册。下面给出了我们的代码片段

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)