slick 3.0.0 с не загруженным драйвером HikariCP - IllegalAccessException: AbstractHikariConfig не может получить доступ к члену с закрытыми модификаторами

Я пытаюсь использовать tminglei/slick-pg v9.0.0 с slick 3.0.0 и получаю IllegalAccessException:

akka.actor.ActorInitializationException: exception during creation
    at akka.actor.ActorInitializationException$.apply(Actor.scala:166) ~[akka-actor_2.11-2.3.11.jar:na]
    ...
Caused by: java.lang.RuntimeException: driverClassName specified class 'com.github.tminglei.MyPostgresDriver$' could not be loaded
    at com.zaxxer.hikari.AbstractHikariConfig.setDriverClassName(AbstractHikariConfig.java:370) ~[HikariCP-java6-2.3.8.jar:na]
    at slick.jdbc.HikariCPJdbcDataSource$$anonfun$forConfig$18.apply(JdbcDataSource.scala:145) ~[slick_2.11-3.0.0.jar:na]
    at slick.jdbc.HikariCPJdbcDataSource$$anonfun$forConfig$18.apply(JdbcDataSource.scala:145) ~[slick_2.11-3.0.0.jar:na]
    at scala.Option.map(Option.scala:146) ~[scala-library-2.11.7.jar:na]
    at slick.jdbc.HikariCPJdbcDataSource$.forConfig(JdbcDataSource.scala:145) ~[slick_2.11-3.0.0.jar:na]
    at slick.jdbc.HikariCPJdbcDataSource$.forConfig(JdbcDataSource.scala:135) ~[slick_2.11-3.0.0.jar:na]
    at slick.jdbc.JdbcDataSource$.forConfig(JdbcDataSource.scala:35) ~[slick_2.11-3.0.0.jar:na]
    at slick.jdbc.JdbcBackend$DatabaseFactoryDef$class.forConfig(JdbcBackend.scala:223) ~[slick_2.11-3.0.0.jar:na]
    at slick.jdbc.JdbcBackend$$anon$3.forConfig(JdbcBackend.scala:33) ~[slick_2.11-3.0.0.jar:na]
    ...
Caused by: java.lang.IllegalAccessException: Class com.zaxxer.hikari.AbstractHikariConfig can not access a member of class com.github.tminglei.MyPostgresDriver$ with modifiers "private"
    at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:109) ~[na:1.7.0_79]
    at java.lang.Class.newInstance(Class.java:373) ~[na:1.7.0_79]
    at com.zaxxer.hikari.AbstractHikariConfig.setDriverClassName(AbstractHikariConfig.java:366) ~[HikariCP-java6-2.3.8.jar:na]
    ... 43 common frames omitted

HikariCP — пул соединений по умолчанию в slick 3.0.0.

Я определил класс драйвера так же, как в пример:

trait MyPostgresDriver extends ExPostgresDriver with PgArraySupport
  with PgEnumSupport
  with PgRangeSupport
  with PgHStoreSupport
  with PgSearchSupport{

  override val api = new MyAPI {}

  //////
  trait MyAPI extends API
  with ArrayImplicits
  with RangeImplicits
  with HStoreImplicits
  with SearchImplicits
  with SearchAssistants

}

object MyPostgresDriver extends MyPostgresDriver

Моя конфигурация базы данных довольно проста [выдержка из конфигурации typesafe следует]:

slick.dbs.default {

  driver="com.github.tminglei.MyPostgresDriver$"

  db {
    driver="org.postgresql.Driver"

    url="jdbc:postgresql://hostname:port/dbname"
    user=user
    password="pass"
  }
}

Не похоже, что это не должно работать, и все же...

Должен ли я как-то изменить свой класс драйвера? Это что-то другое?

Примечание: как видно из трассировки стека, которую я использую

  1. Ява 1.7.0_79
  2. Скала 2.11.7
  3. akka 2.3.11 (делюсь конфигом для slick и akka)
  4. гладкий 3.0.0
  5. HikariCP-java6 2.3.8
  6. tminglei's slick-pg_core 0.9.0

Наконец, при отладке кода jdk в Class.class (декомпилированная строка 143)

 Constructor tmpConstructor1 = this.cachedConstructor; 

Я получаю следующее значение (toString'ed) (как показано intellij):

private com.github.tminglei.MyPostgresDriver$()

Может ли это свидетельствовать о проблеме? Если да, то как мне это исправить?


ИЗМЕНИТЬ

Я заменил пользовательскую конфигурацию драйвера стандартным PostgresDriver следующим образом:

slick.dbs.default {

  driver="slick.driver.PostgresDriver$"

  db {
    driver="org.postgresql.Driver"

    url="jdbc:postgresql://hostname:port/dbname"
    user=user
    password="pass"
  }
}

Ошибка та же:

akka.actor.ActorInitializationException: exception during creation
    ...
Caused by: java.lang.RuntimeException: driverClassName specified class 'slick.driver.PostgresDriver$' could not be loaded
    ... 
Caused by: java.lang.IllegalAccessException: Class com.zaxxer.hikari.AbstractHikariConfig can not access a member of class slick.driver.PostgresDriver$ with modifiers "private"

person Yaneeve    schedule 01.07.2015    source источник
comment
Похоже, это может быть вызвано частным конструктором...?   -  person brettw    schedule 01.07.2015
comment
вроде бы да, но я не могу понять, где... как вы понимаете, я довольно новичок в Scala...   -  person Yaneeve    schedule 01.07.2015
comment
@brettw добавил правку. Казалось бы, стоковый драйвер тоже не работает   -  person Yaneeve    schedule 01.07.2015
comment
Хотя это не вопрос Play Framework как таковой, вы, вероятно, найдете там много помощи, так как там есть полезные ребята из Scala и ребята из Slick 3.0.   -  person brettw    schedule 01.07.2015


Ответы (1)


У меня была аналогичная проблема.

Я думаю, что вы используете Database.forConfig("slick.dbs.default"), но ваш файл конфигурации находится в DatabaseConfig формат.

Вместо этого попробуйте использовать:

val dbConfig: DatabaseConfig[PostgresDriver] = DatabaseConfig.forConfig("slick.dbs.default")
val db = dbConfig.db
person jeckhart    schedule 09.07.2015
comment
Спасибо! Сделал работу отлично! Если бы не ваш ответ, я был бы в шоке :) - person Yaneeve; 12.07.2015