【问题标题】:Scala Slick - Infinite recursion (StackOverflowError) on query resultsScala Slick - 查询结果上的无限递归 (StackOverflowError)
【发布时间】:2016-09-29 01:11:58
【问题描述】:

我在 Twitter Finatra 应用程序上使用 Slick。最后我以为我做到了,但是现在,当我想处理结果时,总是会遇到递归错误。我环顾四周,但没有发现任何对这个特定问题有帮助的东西。我的代码其实很简单:

将数据库类映射到自定义类型:

package com.configurationManagement.library

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

型号:

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)
}

控制器:

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))
  }
}

错误来了

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

显然这行会导致错误:

query.map(_.name)

【问题讨论】:

    标签: scala post recursion stack-overflow slick


    【解决方案1】:

    我看到了两件事,首先您需要将.result 添加到查询中以将其转换为FixedSqlStreamingAction,其次您需要一个数据库来运行该查询:

    private[this] val database: slick.driver.MySQLDriver.backend.DatabaseDef = Database.forDataSource(...)
    
    database.run(templates.filter(_.id === 1).map(_.name).result)
    

    它返回一个Future[Seq[String]],这可能是来自response.ok 的预期类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 2020-02-12
      • 2012-12-21
      相关资源
      最近更新 更多