Première question.Utilisation du service de messagerie Google avec SSL sur Resin 3.1 dans AWS
Je cherche de l'aide pour configurer java & résine pour me permettre d'ouvrir une connexion URL https à partir de mon application. Les documents Resin ne disent pas, je pense que je fais la bonne chose en Java, mais je cours dans un "java.lang.NoClassDefFoundError: Impossible d'initialiser la classe sun.net.www.protocol.https.DelegateHttpsUrlConnection" . Je m'attends à ce que le correctif soit une seule ligne dans un fichier de configuration ou un pot manquant ... mais lequel ??
Plus de détails:
Linux Oracle JDK 1.7 Résine 3.1 (oui il est vieux) Google Mail api v1 (voir la dépendance maven ci-dessous)
J'ai mis en place une classe GmailSender qui envoie un courrier électronique à de mon application:
httpTransport = GoogleNetHttpTransport.newTrustedTransport();
...
private Credential authorizeServiceAccount() throws IOException, GeneralSecurityException {
Credential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(serviceAccountId)
.setServiceAccountPrivateKeyFromP12File(new File(privateKeyFileName))
.setServiceAccountScopes(SCOPES)
.setServiceAccountUser(serviceAccountUser)
.build();
return credential;
}
Gmail getGmailService() throws IOException, GeneralSecurityException {
Credential credential = authorizeServiceAccount();
return new Gmail.Builder(httpTransport, JSON_FACTORY, credential)
.setApplicationName(applicationName)
.build();
}
public void send(SimpleMailMessage simpleMailMessage) throws MailException {
Message m;
try {
MimeMessage mm = asMimeMessage(simpleMailMessage);
m = asMessage(mm);
} catch (IOException e) {
throw new MailPreparationException("Unable to create email", e);
} catch (MessagingException e) {
throw new MailPreparationException("Unable to create email", e);
}
try {
Gmail gmail = getGmailService();
m = gmail.users().messages().send("me", m).execute();
} catch (IOException e) {
throw new MailSendException("Unable to send mail", e);
} catch (GeneralSecurityException e) {
throw new MailSendException("Could not send email", e);
} catch (Throwable t) {
throw new MailSendException("Unexpected failure sending email", t);
}
String id = m.getId();
//System.out.println("Mail sent. Id is: " + id);
}
Et la configuration maven:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-gmail</artifactId>
<version>v1-rev35-1.21.0</version>
</dependency>
<dependency>
<groupId>com.google.oauth-client</groupId>
<artifactId>google-oauth-client-jetty</artifactId>
<version>1.21.0</version>
</dependency>
Et l'exception - semble généralement bon, sauf pour la question de la définition de la classe:
20160326-15:15:54.481org.springframework.mail.MailSendException; nested exceptions (0) are: 20160326-15:15:54.481Caused by: java.lang.NoClassDefFoundError: Could not initialize class sun.net.www.protocol.https.DelegateHttpsURLConnection 20160326-15:15:54.481 at sun.net.www.protocol.https.HttpsURLConnectionImpl.(HttpsURLConnectionImpl.java:86) 20160326-15:15:54.481 at sun.net.www.protocol.https.Handler.openConnection(Handler.java:62) 20160326-15:15:54.481 at sun.net.www.protocol.https.Handler.openConnection(Handler.java:57) 20160326-15:15:54.481 at java.net.URL.openConnection(URL.java:971) 20160326-15:15:54.481 at com.google.api.client.http.javanet.DefaultConnectionFactory.openConnection(DefaultConnectionFactory.java:31) 20160326-15:15:54.481 at com.google.api.client.http.javanet.NetHttpTransport.buildRequest(NetHttpTransport.java:136) 20160326-15:15:54.481 at com.google.api.client.http.javanet.NetHttpTransport.buildRequest(NetHttpTransport.java:62) 20160326-15:15:54.481 at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:863) 20160326-15:15:54.481 at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:283) 20160326-15:15:54.481 at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307) 20160326-15:15:54.481 at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384) 20160326-15:15:54.481 at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489) 20160326-15:15:54.481 at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:217) 20160326-15:15:54.481 at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859) 20160326-15:15:54.481 at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) 20160326-15:15:54.481 at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 20160326-15:15:54.481 at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 20160326-15:15:54.481 at MyPackage.GmailSender.send(GmailSender.java:155)
Je l'ai expérimenté avec la définition des protocoles dans ma résine script de démarrage:
args="-jar $RESIN_HOME/lib/resin.jar -server-root $SERVER_ROOT -conf $config -server $SERVER_NAME"
#args="-Dhttps.protocols=TLSv1.2,TLSv1.1,TLSv1 -jar $RESIN_HOME/lib/resin.jar -server-root $SERVER_ROOT -conf $config -server $SERVER_NAME"
Mais ce changement semble avoir aucun impact. Qu'est-ce que je rate??
Merci!
Je m'éloigne de cette approche pour utiliser l'API Google Mail plus rapide et plus sécurisée. Mes tests Junit fonctionnent bien - ils ne fonctionnent pas dans le conteneur Web. – tfield