Skip to content

In Play 2.8.2, slick.dbs.default.profile config throws ClassNotFound exception when using custom Profile #572

@alternegro

Description

@alternegro

Corresponding Slick PG Issue

Play Slick Version

5.0.0

Play Version

2.8.2

API

Scala 2.13.2

Operating System

macOS 10.15.5

JDK

java version 11

Library Dependencies

"com.github.tminglei" %% "slick-pg" % "0.19.0"
"org.postgresql" % "postgresql" % "42.2.13"
"com.typesafe.slick" %% "slick" % "3.3.2"
"com.typesafe.slick" %% "slick-hikaricp" % "3.3.2"
"com.typesafe.play" %% "play-slick" % "5.0.0"
"com.typesafe.play" %% "play-slick-evolutions" % "5.0.0"

Expected Behavior

  1. Application should connect to database as it does in version 2.8.1 when configured like below in application.conf
slick {
  dbs {
    default {
      profile = "io.mydomain.persistence.PostgresProfile$"
      db {
        driver = "org.postgresql.Driver"
        url = "jdbc:postgresql://localhost:5432/thedatabase"
        user = "theuser"
        password = "thepassword"
      }
    }
  }
}
package io.mydomain.persistence

import com.github.tminglei.slickpg._
import slick.driver.JdbcProfile
import slick.basic.Capability
import play.api.libs.json.{Format, Json, JsValue}

trait PostgresProfile
  extends ExPostgresProfile
                          with PgArraySupport
                          with PgDate2Support
                          with PgRangeSupport
                          with PgHStoreSupport
                          with PgPlayJsonSupport
                          with PgSearchSupport
                          with PgPostGISSupport
                          with PgNetSupport
                          with PgLTreeSupport {
  def pgjson = "jsonb" 

  override val api = MyAPI

  object MyAPI extends API with ArrayImplicits
                           with DateTimeImplicits
                           with JsonImplicits
                           with NetImplicits
                           with LTreeImplicits
                           with RangeImplicits
                           with HStoreImplicits
                           with SearchImplicits
                           with SearchAssistants {
    implicit val strListTypeMapper = new SimpleArrayJdbcType[String]("text").to(_.toList)
    implicit val playJsonArrayTypeMapper =
      new AdvancedArrayJdbcType[JsValue](pgjson,
        (s) => utils.SimpleArrayUtils.fromString[JsValue](Json.parse(_))(s).orNull,
        (v) => utils.SimpleArrayUtils.mkString[JsValue](_.toString())(v)
      ).to(_.toList)
  }
}

object PostgresProfile extends PostgresProfile

Actual Behavior

  1. Fails to connect to database when
play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [default]]
        at play.api.Configuration$.configError(Configuration.scala:155)
        at play.api.Configuration.reportError(Configuration.scala:394)
        at play.api.db.slick.DefaultSlickApi$DatabaseConfigFactory.create(SlickApi.scala:99)
        at play.api.db.slick.DefaultSlickApi$DatabaseConfigFactory.get$lzycompute(SlickApi.scala:87)
        at play.api.db.slick.DefaultSlickApi$DatabaseConfigFactory.get(SlickApi.scala:86)
        at play.api.db.slick.DefaultSlickApi.dbConfig(SlickApi.scala:70)
        at TestApp.dbConfig$lzycompute(Loader.scala:36)
        at TestApp.dbConfig(Loader.scala:36)
        at TestApp.signUpCodesService$lzycompute(Loader.scala:42)
        at TestApp.signUpCodesService(Loader.scala:42)
Caused by: slick.SlickException: Error getting instance of profile "io.mydomain.persistence.PostgresProfile$"
        at slick.basic.DatabaseConfig$.forConfig(DatabaseConfig.scala:95)
        at play.api.db.slick.DefaultSlickApi$DatabaseConfigFactory.create(SlickApi.scala:95)
        at play.api.db.slick.DefaultSlickApi$DatabaseConfigFactory.get$lzycompute(SlickApi.scala:87)
        at play.api.db.slick.DefaultSlickApi$DatabaseConfigFactory.get(SlickApi.scala:86)
        at play.api.db.slick.DefaultSlickApi.dbConfig(SlickApi.scala:70)
        at TestApp.dbConfig$lzycompute(Loader.scala:36)
        at TestApp.dbConfig(Loader.scala:36)
        at TestApp.signUpCodesService$lzycompute(Loader.scala:42)
        at TestApp.signUpCodesService(Loader.scala:42)
        at TestApp.signUpCodesController$lzycompute(Loader.scala:55)
Caused by: java.lang.ClassNotFoundException: io.mydomain.persistence.PostgresProfile$
        at java.base/java.lang.ClassLoader.findClass(ClassLoader.java:719)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:589)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
        at slick.util.ClassLoaderUtil$$anon$1.loadClass(ClassLoaderUtil.scala:17)
        at slick.basic.DatabaseConfig$.forConfig(DatabaseConfig.scala:92)
        at play.api.db.slick.DefaultSlickApi$DatabaseConfigFactory.create(SlickApi.scala:95)
        at play.api.db.slick.DefaultSlickApi$DatabaseConfigFactory.get$lzycompute(SlickApi.scala:87)
        at play.api.db.slick.DefaultSlickApi$DatabaseConfigFactory.get(SlickApi.scala:86)
        at play.api.db.slick.DefaultSlickApi.dbConfig(SlickApi.scala:70)
        at TestApp.dbConfig$lzycompute(Loader.scala:36)

Reproducible Test Case

The issue goes away when I simply change the Play plugin version from 2.8.2 to 2.8.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions