2016-05-31 14 views
0

Ich spiele mit Slick auf einer Twitter Finatra-Anwendung. Endlich dachte ich, ich hätte es geschafft, aber jetzt, wenn ich ein Ergebnis verarbeiten will, bekomme ich immer einen Rekursionsfehler. Ich schaute mich um, aber ich fand nichts hilfreiches für dieses spezielle Problem. Der Code, den ich habe, ist eigentlich ganz einfach:Scala Slick - Unendliche Rekursion (StackOverflowError) auf Abfrageergebnisse

die Datenbank-Klasse zu einem benutzerdefinierten Typ Karte:

package com.configurationManagement.library 

package object Types { 
    type SlickDatabase = slick.driver.MySQLDriver.api.Database 
} 

Modell:

package com.configurationManagement.app.domain 

import slick.lifted.Tag 
import slick.driver.MySQLDriver.api._ 
import slick.profile.SqlProfile.ColumnOption.NotNull 

case class ConfigurationTemplate(id: Option[Int], name: String) 

class ConfigurationTemplates(tag: Tag) extends Table[ConfigurationTemplate](tag: Tag, "configuration_template") { 
    def id = column[Int]("id", O.AutoInc, O.PrimaryKey) 
    def name = column[String]("name", NotNull) 
    def uniqueNameIndex = index("unique_name", name, unique = true) 

    def * = (id.?, name) <> (ConfigurationTemplate.tupled, ConfigurationTemplate.unapply) 
} 

Controller:

package com.configurationManagement.app.controller 

import com.google.inject.{Inject, Singleton} 
import com.configurationManagement.app.domain.ConfigurationTemplates 
import com.configurationManagement.app.dto.request.RequestConfigurationTemplateDto 
import com.configurationManagement.library.Types._ 
import com.twitter.finatra.http.Controller 
import com.twitter.inject.Logging 
import slick.driver.MySQLDriver.api._ 

@Singleton 
class ConfigurationTemplateController @Inject()(database: SlickDatabase) 
    extends Controller with Logging with FutureConverter { 

    post("/configurations/templates") { dto: RequestConfigurationTemplateDto => 
    val templates = TableQuery[ConfigurationTemplates] 
    val query = templates.filter(_.id === 1) 
    response.ok(query.map(_.name)) 
    } 
} 

Und hier kommt der Fehler

Infinite recursion (StackOverflowError) (through reference chain: com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast.TableNode["driver_table"]->com.configurationManagement.app.domain.ConfigurationTemplates["table_node"]->slick.ast 

Obvisously diese Zeile verursacht den Fehler:

query.map(_.name) 

Antwort

1

Zwei Dinge, die ich sehen, müssen Sie zuerst .result auf die Abfrage hinzuzufügen es in eine FixedSqlStreamingAction zu verwandeln, zweite müssen Sie eine Datenbank, die Abfrage auszuführen:

private[this] val database: slick.driver.MySQLDriver.backend.DatabaseDef = Database.forDataSource(...) 

database.run(templates.filter(_.id === 1).map(_.name).result) 

, die ein Future[Seq[String]] zurückgibt, ist dies wahrscheinlich der erwartete Typ von response.ok.

+0

Hallo, das hat funktioniert. Vielen Dank! – xm22

Verwandte Themen