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)
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());
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"
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()));
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