web-dev-qa-db-fra.com

java.lang.ClassCastException: com.Sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl ne peut pas être converti en javax.net.ssl.HttpsURLConnection

J'ai essayé ce code dans mon Netbeans 7.4 et cela fonctionne sans problème

import Java.io.IOException;
import Java.net.URL;
import javax.net.ssl.HttpsURLConnection;

public class JavaApplication148 {
    public static void main(String[] args) throws IOException {
        URL url = new URL("https://redmine.ackee.cz/time_entries.xml");
        HttpsURLConnection httpCon = (HttpsURLConnection) url.openConnection();
    }
}

Cependant, je l'ai utilisé dans Eclipse dans mon projet piloté par maven et il génère l'exception suivante:

Java.lang.ClassCastException: com.Sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl 
cannot be cast to javax.net.ssl.HttpsURLConnection

C'est la classe suivante dans mon projet maven qui génère une erreur

package cz.ackee.redmine.commands;

import Java.io.IOException;
import Java.net.URL;
import javax.net.ssl.HttpsURLConnection;

public abstract class RedmineCommand {      
    public void write(String xmlAddress, String text, String requestMethod) throws IOException{         
         URL url = new URL("https://redmine.xxx.cz/time_entries.xml");
         HttpsURLConnection httpCon = (HttpsURLConnection) url.openConnection(); //this line throws exception
    }       
}

C'est mon pom.xml

<project xmlns="http://maven.Apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cz.ackee</groupId>
    <artifactId>pan-Unicorn-bot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Pan Unicorn Bot</name>
    <description>Pan Unicorn IRC Bot</description>

  <repositories>
  <repository>
    <id>Apache-snapshots</id>
    <url>http://repository.Apache.org/snapshots/</url>
  </repository>
  </repositories>

    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-Java</artifactId>
            <version>5.1.30</version>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>4.3.5.Final</version>
        </dependency>

        <dependency>
            <groupId>org.Apache.commons</groupId>
            <artifactId>commons-cli</artifactId>
            <version>1.3-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.taskadapter</groupId>
            <artifactId>redmine-Java-api</artifactId>
            <version>1.23</version>
        </dependency>
    </dependencies>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <groupId>org.Apache.maven.plugins</groupId>
                <version>2.3</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>

            <plugin>
                <artifactId>maven-Assembly-plugin</artifactId>
                <version>2.2.1</version>
                <configuration>
                    <descriptors>
                        <descriptor>/src/main/Assembly/binary.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-Assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <archive>
                        <index>true</index>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>cz.ackee.Unicorn.PanUnicornMain</mainClass>
                        </manifest>
                        <manifestEntries>
                            <mode>development</mode>
                            <url>${project.url}</url>
                            <key>value</key>
                        </manifestEntries>
                    </archive>
                </configuration>

            </plugin>
        </plugins>
    </build>

</project>

Une idée, pourquoi il compile et s'exécute sans problème sur les netbeans et pourquoi cela ne va pas bien sur le projet maven-Eclipse?

(Je compile via la ligne de commande en utilisant mvn package, Je le lance via Eclipse)

13
libik

La solution est de changer cette ligne

URL url = new URL("https://redmine.xxx.cz/time_entries.xml");

dans cette ligne

URL url = new URL(null, "https://redmine.xxx.cz/time_entries.xml", new Sun.net.www.protocol.https.Handler());
22
libik

Si vous utilisez simplement le protocole HTTP (pas HTTPS), au lieu de:

HttpsURLConnection httpCon = (HttpsURLConnection) url.openConnection ();

Utilisez ceci:

HttpURLConnection httpCon = (HttpURLConnection) url.openConnection ();

Déposez simplement le "s" dans "Http s URLConnection"

13
Realdo Dias

Pour éviter ce type d'erreur, vous pouvez utiliser HttpUrlConnection (Java.net.HttpUrlConnection) pour les URL http et https

HttpsUrlConnection n'ajoute que des méthodes supplémentaires qui "peuvent être utilisées" pour la connexion https mais vous n'utiliserez probablement pas ces méthodes.

HttpsUrlConnection et HttpUrlConnection dérivent de UrlConnection qui contient des méthodes qui permettent de lire la réponse comme getInputStream (). HttpsUrlConnection dérivé de HttpUrlConnection qui dérivait de UrlConnection.

Java.net.HttpUrlConnection ajoute simplement des méthodes relatives au protocole http (ces méthodes s'appliquent à https)

https://docs.Oracle.com/javase/8/docs/api/Java/net/HttpURLConnection.htmlhttps://docs.Oracle.com/javase/8/ docs/api/javax/net/ssl/HttpsURLConnection.html

Ainsi, vous pouvez le faire:

URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));

Vous pouvez également le faire et obtenir le même résultat, la connexion sera la même:

URL url = new URL(urlString);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setRequestMethod("GET");
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
1
Nico

Il a appelé si l'URL commence par "https"

    if(url.startswith("https"){ HttpsURLConnection httpCon = (HttpsURLConnection) url.openConnection(); }

utilisez netty-3.9.2> .jar pour résoudre ce problème Lorsque vous utilisez ce netty.jar. le processus de post-appel a changé.

http://dl.bintray.com/netty/downloads/netty-3.9.12.Final.tar.bz2

1
Sachin Panchal