You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by "TeslaCN (via GitHub)" <gi...@apache.org> on 2023/04/07 02:46:19 UTC

[GitHub] [shardingsphere] TeslaCN commented on issue #22544: Provider PostgreSQLDialectExceptionMapper could not be instantiated

TeslaCN commented on issue #22544:
URL: https://github.com/apache/shardingsphere/issues/22544#issuecomment-1499873179

   I've confirmed this issue.
   
   I wrote a test. Exclude PostgreSQL JDBC Driver from classpath.
   ```java
   import org.apache.shardingsphere.dialect.SQLExceptionTransformEngine;
   import org.apache.shardingsphere.dialect.postgresql.exception.authority.InvalidPasswordException;
   import org.junit.jupiter.api.Test;
   
   class SQLExceptionTransformEngineTest {
       
       @Test
       void assertMySQLToSQLException() {
           SQLExceptionTransformEngine.toSQLException(new InvalidPasswordException("user"), "MySQL");
       }
   }
   ```
   
   ```
   java.util.ServiceConfigurationError: org.apache.shardingsphere.dialect.mapper.SQLDialectExceptionMapper: org.apache.shardingsphere.dialect.postgresql.mapper.PostgreSQLDialectExceptionMapper Unable to get public no-arg constructor
   
   	at java.base/java.util.ServiceLoader.fail(ServiceLoader.java:586)
   	at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:679)
   	at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNextService(ServiceLoader.java:1240)
   	at java.base/java.util.ServiceLoader$LazyClassPathLookupIterator.hasNext(ServiceLoader.java:1273)
   	at java.base/java.util.ServiceLoader$2.hasNext(ServiceLoader.java:1309)
   	at java.base/java.util.ServiceLoader$3.hasNext(ServiceLoader.java:1393)
   	at org.apache.shardingsphere.infra.util.spi.ShardingSphereServiceLoader.load(ShardingSphereServiceLoader.java:58)
   	at org.apache.shardingsphere.infra.util.spi.ShardingSphereServiceLoader.<init>(ShardingSphereServiceLoader.java:48)
   	at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
   	at org.apache.shardingsphere.infra.util.spi.ShardingSphereServiceLoader.getServiceInstances(ShardingSphereServiceLoader.java:75)
   	at org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader.findService(TypedSPILoader.java:72)
   	at org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader.findService(TypedSPILoader.java:56)
   	at org.apache.shardingsphere.dialect.SQLExceptionTransformEngine.toSQLException(SQLExceptionTransformEngine.java:57)
   	at org.apache.shardingsphere.proxy.SQLExceptionTransformEngineTest.assertMySQLToSQLException(SQLExceptionTransformEngineTest.java:28)
   
   Omit junit stacks...
   
   Caused by: java.lang.NoClassDefFoundError: org/postgresql/util/PSQLException
   	at java.base/java.lang.Class.getDeclaredConstructors0(Native Method)
   	at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3373)
   	at java.base/java.lang.Class.getConstructor0(Class.java:3578)
   	at java.base/java.lang.Class.getConstructor(Class.java:2271)
   	at java.base/java.util.ServiceLoader$1.run(ServiceLoader.java:666)
   	at java.base/java.util.ServiceLoader$1.run(ServiceLoader.java:663)
   	at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
   	at java.base/java.util.ServiceLoader.getConstructor(ServiceLoader.java:674)
   	... 82 more
   Caused by: java.lang.ClassNotFoundException: org.postgresql.util.PSQLException
   	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
   	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
   	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
   	... 90 more
   ```
   
   I changed the convert method to the following:
   ```java
   public final class PostgreSQLDialectExceptionMapper implements SQLDialectExceptionMapper {
       
       @Override
       public SQLException convert(final SQLDialectException sqlDialectException) {
           PSQLException throwables = new PSQLException(sqlDialectException.getMessage(), PSQLState.UNEXPECTED_ERROR);
           return throwables;
   //        return null;
       }
   // ClassNotFoundException occurred in test.
   ```
   
   
   ```java
   public final class PostgreSQLDialectExceptionMapper implements SQLDialectExceptionMapper {
       
       @Override
       public SQLException convert(final SQLDialectException sqlDialectException) {
           PSQLException throwables = new PSQLException(sqlDialectException.getMessage(), PSQLState.UNEXPECTED_ERROR);
   //        return throwables;
           return null;
       }
   // No error occurred in test.
   ```
   
   **So this issue is caused by returning an instance of a class not in classpath.**
   
   Adding `-Xverify:none` or `-noverify` could avoid `ClassNotFoundException`, but options `-Xverify:none` and `-noverify` were deprecated in JDK 13 and will likely be removed in a future release.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@shardingsphere.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org