java.lang.NoClassDefFoundError: javax/net/ssl/TrustManager - Issue while connecting to database through Connection Pool in AEM
I was getting the below exception while trying to connect to MySQL database through JDBC connection pool in AEM 6.4 with Java 1.8
Exception:
java.lang.NoClassDefFoundError: javax/net/ssl/TrustManager
at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:334)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.negotiateSSLConnection(NativeAuthenticationProvider.java:777)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.proceedHandshakeWithPluggableAuthentication(NativeAuthenticationProvider.java:486)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:202)
at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1452)
at com.mysql.cj.NativeSession.connect(NativeSession.java:165)
at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at aemmysql.core.servlets.FirstServletSelector1.doGet(FirstServletSelector1.java:32)
Configured the Data source as below:
Code:
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.SlingAllMethodsServlet;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.io.IOException;
import java.sql.*;
import com.day.commons.datasource.poolservice.DataSourcePool;
import javax.sql.DataSource;
import org.osgi.service.component.annotations.Reference;
@Component(service=Servlet.class,
property={
Constants.SERVICE_DESCRIPTION + "=Simple Demo Servlet",
"sling.servlet.methods=" + HttpConstants.METHOD_GET,
"sling.servlet.paths="+ "/bin/servlet/mysqldata"
})
public class FirstServletSelector1 extends SlingAllMethodsServlet {
@Reference
private DataSourcePool dataSourceService;
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
try{
Connection con=((DataSource) dataSourceService.getDataSource("SampleOracleDS")).getConnection();;
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from sample");
while(rs.next())
System.out.println(rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3));
con.close();
}catch(Exception e){
System.out.println(e);
}
}
}
Configured the Import-Package in the core bundle pom.xml with com.mysql.cj.jdbc
<Import-Package>com.mysql.cj.jdbc,javax.inject;version=0.0.0,*</Import-Package>
Downloaded the connector jar from the following location and installed JAR to AEM server by converting to OSGI bundle
The same exception was displayed even after adding the javax.net.ssl package as part of the Import-Package in MySQL connector OSGI bundle.
After little struggle i found that the package javax.net.ssl should be added to org.osgi.framework.bootdelegation property in crx-quickstart\conf\sling.properties
org.osgi.framework.bootdelegation=javax.net.ssl,com.yourkit.*, ${org.apache.sling.launcher.bootdelegation}
After restarting the server started getting the below exception
Exception:
java.lang.NoClassDefFoundError: javax/crypto/NoSuchPaddingException
at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:334)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.negotiateSSLConnection(NativeAuthenticationProvider.java:777)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.proceedHandshakeWithPluggableAuthentication(NativeAuthenticationProvider.java:486)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:202)
at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1452)
at com.mysql.cj.NativeSession.connect(NativeSession.java:165)
at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at aemmysql.core.servlets.FirstServletSelector1.doGet(FirstServletSelector1.java:32)
Additional to javax.net.ssl, the package javax.crypto should be added to org.osgi.framework.bootdelegation property in crx-quickstart\conf\sling.properties
org.osgi.framework.bootdelegation=javax.net.ssl,javax.crypto,com.yourkit.*, ${org.apache.sling.launcher.bootdelegation}
After restarting the server started getting another error
Exception:
java.lang.NoClassDefFoundError: javax/naming/InvalidNameException
at com.mysql.cj.protocol.ExportControlled.getSSLContext(ExportControlled.java:530)
at com.mysql.cj.protocol.ExportControlled.performTlsHandshake(ExportControlled.java:302)
at com.mysql.cj.protocol.StandardSocketFactory.performTlsHandshake(StandardSocketFactory.java:188)
at com.mysql.cj.protocol.a.NativeSocketConnection.performTlsHandshake(NativeSocketConnection.java:99)
at com.mysql.cj.protocol.a.NativeProtocol.negotiateSSLConnection(NativeProtocol.java:352)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.negotiateSSLConnection(NativeAuthenticationProvider.java:777)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.proceedHandshakeWithPluggableAuthentication(NativeAuthenticationProvider.java:486)
at com.mysql.cj.protocol.a.NativeAuthenticationProvider.connect(NativeAuthenticationProvider.java:202)
at com.mysql.cj.protocol.a.NativeProtocol.connect(NativeProtocol.java:1452)
at com.mysql.cj.NativeSession.connect(NativeSession.java:165)
at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:955)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at aemmysql.core.servlets.FirstServletSelector1.doGet(FirstServletSelector1.java:32)
org.osgi.framework.bootdelegation=javax.net.ssl,javax.crypto,javax.naming,com.yourkit.*, ${org.apache.sling.launcher.bootdelegation}
The database connectivity is successful after restarting the server.
Refer https://www.albinsblog.com/2015/03/how-to-connect-to-oracle-database-using.html#.XPLN8YhKjIU for complete details on connecting to database through JDBC connection pool.
Its very helpful blog.. i was struggling hard to resolve my issue related to connecting AEM with MySQL, After adding com.mysql.cj.jdbc.Driver to JDBC driver class in the JDBC pool configuration, it worked!!
ReplyDeleteThanks a lot!! Looking forward for more blogs like this...