2013-06-11 23 views
16

Piszę aplikację internetową Scala przy użyciu Play Framework 2.1.1 przy użyciu lokalnej bazy danych Postgres wraz z Slick 1.0.0, a ja wpadam w to, co wydaje się być tutaj sprzecznością.Dlaczego akcja akcji kończy się niepowodzeniem z "nie znaleziono odpowiedniego sterownika" w wersjach Slick i PostgreSQL?

Jest to błąd biegnę do:

[SQLException: No suitable driver found for postgres://user:[email protected]:5432/postgres] 
56 
57 def instance = Action { 
58 Database.forURL("postgres://user:[email protected]:5432/postgres", driver = "org.postgresql.Driver") withSession { 
59  val q = Retailer.map(_.name) 
60  Ok(views.html.instance(q.list, newRForm)) 
61 } 
62 } 
63 

Gdzie user i password są odpowiednio username i password bazy danych PostgreSQL.

W java error (No suitable driver found) znalazłem:

  1. Musisz załadować sterownika gdzieś korzystając Class.forName("org.postgresql.Driver");
  2. Musisz pliku jar kierowcy PostgreSQL w ścieżce klasy twojego programu.

W Application.scala Mam następujący fragment kodu:

{ 
    println(ConfigFactory.load().getString("db.default.url")) 
    println(Class.forName("org.postgresql.Driver")) 
} 

ponowne uruchomienie play compile wyniki w:

(Server started, use Ctrl+D to stop and go back to the console...) 

[info] play - database [default] connected at jdbc:postgresql://localhost:5432/postgres 
[info] play - Application started (Dev) 
postgres://user:[email protected]:5432/postgres 
class org.postgresql.Driver 
[error] application - 

! @6ei1nhkop - Internal server error, for (GET) [/instance] -> 

play.api.Application$$anon$1: Execution exception[[SQLException: No suitable driver found for jdbc:postgresql://user:[email protected]:5432/postgres]] 
     at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.1] 
     at play.api.DefaultApplication.handleError(Application.scala:383) [play_2.10.jar:2.1.1] 
     at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:326) [play_2.10.jar:2.1.1] 
     at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$17$$anonfun$apply$24.apply(PlayDefaultUpstreamHandler.scala:324) [play_2.10.jar:2.1.1] 
     at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1] 
     at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.1] 
java.sql.SQLException: No suitable driver found for jdbc:postgresql://user:[email protected]:5432/postgres 
     at java.sql.DriverManager.getConnection(Unknown Source) ~[na:1.7.0_21] 
     at java.sql.DriverManager.getConnection(Unknown Source) ~[na:1.7.0_21] 
     at scala.slick.session.Database$$anon$2.createConnection(Database.scala:105) ~[slick_2.10-1.0.0.jar:1.0.0] 
     at scala.slick.session.BaseSession.conn$lzycompute(Session.scala:207) ~[slick_2.10-1.0.0.jar:1.0.0] 
     at scala.slick.session.BaseSession.conn(Session.scala:207) ~[slick_2.10-1.0.0.jar:1.0.0] 
     at scala.slick.session.BaseSession.close(Session.scala:221) ~[slick_2.10-1.0.0.jar:1.0.0] 

Potem biegnę play dependencies i postgres .jar został rozwiązany!

Here are the resolved dependencies of your application: 
+--------------------------------------------------------+--------------------------------------------------------+-----------------------------------+ 
| ←[32mpostgresql:postgresql:9.1-901-1.jdbc4←[0m   | ←[37mats:ats_2.10:1.0-SNAPSHOT←[0m      | ←[37mAs postgresql-9.1-901-1.jdbc4.jar←[0m | 
+--------------------------------------------------------+--------------------------------------------------------+-----------------------------------+ 

Dlaczego nie można znaleźć odpowiedniego sterownika?

conf/application.conf

# Database configuration 
db.default.driver=org.postgresql.Driver 
db.default.url="jdbc:postgres://user:[email protected]:5432/postgres" 
db.default.user=user  
db.default.password=password 

projekt/Build.scala

import sbt._ 
import Keys._ 
import play.Project._ 

object ApplicationBuild extends Build { 

    val appName = "ats" 
    val appVersion = "1.0-SNAPSHOT" 

    val appDependencies = Seq(
    // Add your project dependencies here, 
    jdbc, 
    "com.typesafe.slick" %% "slick"  % "1.0.0", 
    "postgresql"   % "postgresql" % "9.1-901-1.jdbc4" 
) 

    val main = play.Project(appName, appVersion, appDependencies).settings(
    // Add your own project settings here  
) 

Mam też postgresql-9.2-1002.jdbc4.jar i slick_2.10-1.0.1-RC1.jar w moim pliku /lib, a moja lokalna wersja PostgreSQL od robienia a SELECT version(); jest 9.2.4 Postgres sterownika wydaje się być RozwiĘ ... zywanie z wersjĘ ... 9.1 .jar i kiedy skomentuj zależność aplikacji, aby /lib było uwzglę dnione samodzielnie, /lib nie wydaje się być w CLASSPATH Play.

Wiem, że adres URL Postgres jest poprawny i mogę połączyć się z moją bazą danych po uruchomieniu mojej aplikacji.

Odpowiedz

16

Miksujesz rzeczy.

Więc patrzyłem na to pytanie, które mówi ...

  1. Musisz załadować sterownika gdzieś. Class.forName ("org.postgresql.Driver");
  2. Będziesz potrzebować pliku .jar sterownika postgresql w ścieżce klas programu.

ten nie ma zastosowania w niniejszej sprawie. Masz strukturę, która zajmuje się tymi rzeczami. Pytanie, na które się powołujesz, opisuje, jak uzyskać dostęp do bazy danych za pomocą "surowego" jdbc.


Oto, jak należy to zrobić.

Przede wszystkim można uprościć część konfiguracji. 5432 to domyślny port dla postresql i localhost jest także domyślnym hostem. Nazwa użytkownika i hasło powinny znajdować się poza adresem URL.

# Database configuration 
db.default.driver=org.postgresql.Driver 
db.default.url=jdbc:postgres:postgres 
db.default.user=user  
db.default.password=password 

Teraz należy zdefiniować odpowiednie zależności sbt. Po prostu usuń pliki JAR z folderu /lib i zaktualizuj swoje zależności, aby uzyskać najnowszy sterownik PostgreSQL (9.2), zmieniając swoje aplikacje zależne od Build.scala. Należy pamiętać, że identyfikator groupId zmienił się z postgresql na org.postgresql.

val appDependencies = Seq(
    // Add your project dependencies here, 
    jdbc, 
    "com.typesafe.slick" %% "slick" % "1.0.0", 
    "org.postgresql" % "postgresql" % "9.3-1102-jdbc41" 
) 

I wreszcie należy zmienić kontroler rozwiązać źródło danych z konfiguracji:

def instance = Action { 
    Database.forDataSource(DB.getDataSource()) withSession { 
    val q = Retailer.map(_.name) 
    Ok(views.html.instance(q.list, newRForm)) 
    } 
} 
+0

Hum. forURL vs forDataSource jest jak sterownik kontra źródło danych w jdbc [http://fernandezpablo85.github.io/2013/04/07/slick_connection_pooling.html] – Meredith

Powiązane problemy