質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

scala playframework ScalikeJDBC モデルにapplyメソッドを追加するとコンパイルエラーが発生

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 185

norun07

score 8

現在Scalaで以下の環境でCRUDアプリを開発しています。
Scala 2.12.6
JDK 1.8.0_251
play
play-json
sbt 1.3.13
h2 1.4.197
ScalikeJDBC 3.2

app/models/User.scala app/models/Post.scalaにapplyメソッドを追加するとコンパイルエラーが発生します。

app/models/User.scala

package models

import scalikejdbc._

case class User(id: Long, name: String)

object User extends SQLSyntaxSupport[User] {

  override val tableName = "user"
  def apply(rs: WrappedResultSet): User = User(rs.long("id"), rs.string("name"))

 //ここから下をコメントアウトするとコンパイルに成功する
  def apply(u: ResultName[User])(rs: WrappedResultSet) = new User(rs.long(u.id), rs.string(u.name))

app/models/Post.scala

package models

import scalikejdbc._
import java.time.ZonedDateTime

case class Post(id: Long,
                userId: Option[Long] = None,
                user: Option[User] = None,
                text: String,
                commentCount: Int,
                postedAt: ZonedDateTime)

object Post extends SQLSyntaxSupport[Post] {

  override val tableName = "post"

  //ここから下をコメントアウトするとコンパイルに成功する
  def apply(p: SyntaxProvider[Post])(rs: WrappedResultSet): Post = apply(p.resultName)(rs)

  def apply(p: ResultName[Post])(rs: WrappedResultSet): Post = new Post(
    id = rs.get(p.id),
    userId = rs.get(p.userId),
    text = rs.get(p.text),
    commentCount = rs.get(p.commentCount),
    postedAt = rs.get(p.postedAt)
  )

  def opt(m: SyntaxProvider[Post])(rs: WrappedResultSet): Option[Post] =
    rs.longOpt(m.resultName.id).map(_ => Post(m)(rs))

  val (u, p) = (User.syntax, Post.syntax)
}

コントローラーにはまだ空のメソッド定義しかしていません。
app/controllers/PostController.scala

package controllers

import javax.inject.{ Inject, Singleton }
import play.api.mvc.{ AbstractController, ControllerComponents }
import scalikejdbc._
import play.api.data._
import play.api.data.Forms._
import models._
@Singleton
class PostController @Inject()(cc: ControllerComponents) extends AbstractController(cc) {

  def index = TODO

  def create = TODO
}

sbtバージョン
[process_args] java_version = '14'
[sbt_options] declare -a sbt_options='()'
[copyRt] java9_rt = '/Users/xxxx/.sbt/0.13/java9-rt-ext-n_a_14_0_1/rt.jar'

Executing command line:
java
-Dfile.encoding=UTF-8
-Xms1024m
-Xmx1024m
-Xss4M
-XX:ReservedCodeCacheSize=128m
-Dscala.ext.dirs=/Users/xxxxx/.sbt/0.13/java9-rt-ext-n_a_14_0_1
-jar
/usr/local/Cellar/sbt/1.3.13/libexec/bin/sbt-launch.jar

プロジェクトのbuild.sbtファイルの依存関係

version := "1.0-SNAPSHOT"

lazy val microBlog = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.12.6"

lazy val defaultDependencies = {
  val scalikeJdbcDependencies = {
    val scalikeJdbcVersion = "3.2.3"
    List(
      "org.scalikejdbc" %% "scalikejdbc"        % scalikeJdbcVersion,
      "org.scalikejdbc" %% "scalikejdbc-config" % scalikeJdbcVersion,
      "org.scalikejdbc" %% "scalikejdbc-play-initializer" % "2.6.0-scalikejdbc-3.2"
    )
  }

  List(
    evolutions, jdbc, guice,
    "com.h2database"  %  "h2"                 % "1.4.197",
    "ch.qos.logback"  %  "logback-classic"    % "1.2.+",
    "org.scalatestplus.play" %% "scalatestplus-play" % "3.1.2" % Test
  ) ++ scalikeJdbcDependencies
}

libraryDependencies ++= defaultDependencies

// sbt scalafmtでコードフォーマット
scalafmtConfig := Some(file(".scalafmt.conf"))
scalafmtOnCompile := true // compile時に自動でコードフォーマット

plugins.sbtファイルの依存関係

addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.6.13")

addSbtPlugin("com.geirsson" % "sbt-scalafmt" % "1.5.1")


build.propertiesファイルに別のバージョンがあり、これをsbtのロードに使用されたバージョンと同じバージョンに設定しました

-sbt.version=1.1.2 //削除
sbt.version=1.3.13 //追加


何卒ご教授の程よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Keyno

    2020/08/09 12:55

    > applyメソッドを追加するとコンパイルエラーが発生します。
    エラーが発生したときのエラー文はどのような内容でしたでしょうか。

    私の環境でバージョンなどを合わせた状態、かつ該当の apply をコメントアウトしない状態で
    ソースコードをコンパイルしてみましたが、正常にコンパイル成功できました。
    文法上も特に問題もなさそうに思いますが、どこかに差分がないか気になっています。

    あと、今回は関係ないと思うのですが、
    JDK のバージョンが「1.8.0_251」と記載されていますが、
    sbt のバージョンでは「[process_args] java_version = '14'」となっていて、
    Java 14 を使用しているようにみえました。
    実行に使われているのはどちらかも教えていただければと思います。

    キャンセル

  • norun07

    2020/08/09 16:17

    質問への回答誠にありがとうございます。
    おっしゃる通りでsbtのバージョンに問題がありました。
    バージョンを11にしたところ問題なくコンパイルされました。

    キャンセル

回答 1

check解決した方法

0

sbtのjavaバージョンを11に変更

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る