ラベル playframework の投稿を表示しています。 すべての投稿を表示
ラベル playframework の投稿を表示しています。 すべての投稿を表示

2013年3月21日木曜日

jacoco4sbtのバージョン2.0.0はPlay 2.1では動かない?

背景

Play 2.1でテストコードを書きながら、コードカバレッジを把握したいなーと思って調べていたところ、
jacoco4sbtなるものを発見しまして。

https://bitbucket.org/jmhofer/jacoco4sbt

問題

で最新が2.0.0ということで色々設定をした後、playコマンドでsbt起動後に
jacoco:cover
 としてみると下記のエラーが。
java.lang.IncompatibleClassChangeError: class org.jacoco.core.internal.flow.ClassProbesVisitor has interface org.objectweb.asm.ClassVisitor as super class

で、どうも同じ症状が出ている人は世の中にいるらしく。
https://bitbucket.org/jmhofer/jacoco4sbt/issue/18/the-conflict-about-asm-library-in-play

 上のリンクの方の推測によると、
Playで使っているASMのバージョンと、Jacocoで使っているASMのバージョンが違うんじゃない?
とのこと。

回避策

jacoco4sbtの1.2.4を使えばいいよ!とのことでした。

pkugin.sbtはこんな感じ。
//Jacoco
libraryDependencies ++= Seq(
  "org.jacoco" % "org.jacoco.core" % "0.5.9.201207300726" artifacts(Artifact("org.jacoco.core", "jar", "jar")),
  "org.jacoco" % "org.jacoco.report" % "0.5.9.201207300726" artifacts(Artifact("org.jacoco.report", "jar", "jar")))

addSbtPlugin("de.johoop" % "jacoco4sbt" % "1.2.4")


その他

ASMって初めて知ったのですが、Javaのbytecodeを操作したり分析したりするフレームワークだそうな。
http://asm.ow2.org/

2013年2月4日月曜日

Play ScalaでのカスタムPathBindableの作成方法(へのリンク)

メモ。

Play Frameworkで独自に作成したクラスなどを
URLパスに指定したい場合、PathBindableを実装する必要があります。

そのやり方を説明してくれているサイトを発見したので備忘録的に書いておきます。

www.soutier.de/blog/2012/12/11/playframework-routes-part-2-advanced/

implicit objectという手があるのかー、
と自分のScala力の低さに悶々としてます。

2012年12月3日月曜日

Play Frameworkの2.1-SNAPSHOTでDoubleのformatterが追加されていた。

Play Frameworkの2.1-SNAPSHOTでDoubleのformatterが追加されていたのでメモ。

Play Frameworkでの入力フォームについて、2.0以前では、自分でDouble型のフォーマットを書かなくちゃいけなくて面倒でしたが、2.1からはデフォルトでフォーマットが提供されるようです。

2.0の場合も、下記の実装をコピーしてフォーマッターを作れば簡単。

https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/data/format/Format.scala#L117

 
via http://stackoverflow.com/questions/12759430/play-bind-a-form-field-to-a-double


使い方


2012年4月15日日曜日

Play Framework 2.0を学ぶ:その2 テンプレートのi18nではまった

Play Framework 2.0(Scala)のテンプレートの国際化ではまったのでメモ。

やりたいこと

テンプレートの文言を外部リソースに切り出したい。
で、言語に対応した文言を表示したい。とりあえず今回は日本語で。


やったこと

Messages and internationalization を参考に、こんな感じで設定。

  1. application.confにて、日本語を使えるように設定。
  2. application.langs="en,ja"
    
    ダブルクオートで囲む必要があるそうな。
  3. conf配下にmessges.jaファイルを作成。
    key=メッセージです!
    
    という形式で登録。
  4. テンプレートを修正し、messagesファイルを参照するよう修正。

    @Mesasges("key")

    という形式で登録。
とここで問題発生。
「メッセージです!」と表示されずに、「key」と表示されてしまいました。

messages.enファイル内でメッセージを定義しても「key」と表示されてしまう始末。

HTTPヘッダーのAccept-Languageにもja、enが含まれているのになー。


解決方法

"play  framework i18n template"で検索したところ、下記を発見。

 i18n error: controller and templates uses different implicit Langs

これによると、
  • Messagesは、implicit paramterとしてLang型の引数(lang)を取る。そのlangは、明示的に指定されない場合、JVMのデフォルトロケールを使う。
  • コントローラ内でMessagesが呼び出される際にimplicit requestが定義してあれば、そのrequestのHTTPヘッダーからAccept-Languageを取得してMessgesの引数langに暗黙的に値を設定してくれる。
  • が、テンプレート内ではスコープ内にlangを見つけられないからJVMデフォルトのロケールが使われるよ。
とのこと。
対応策としては、テンプレートの引数にimplicit parameterとしてLangを付与すれば良い、ということで、viewは下記の通りになります。
(1行目が追加した箇所)


@(implicit lang: Lang)

@Mesasges("key")


こうすると、Messagesの引数に暗黙的にlangの値が渡され、今回の日本語環境の場合はmessages.jaに定義された値を表示します。

2012年2月7日火曜日

Play Framework 2.0を学ぶ:その1 template engine

このあたりを見ながら個人的に重要そうな部分を抜粋。
https://github.com/playframework/Play20/wiki/ScalaTemplates

Play Scalaテンプレート

Play Scalaテンプレートは標準のScalaのfunction(以降、関数)にコンパイルされます。
下記のようなconvention(規約)に基づきます。

views/Application/index.scala.html

というテンプレートファイルを作ると
views.html.Application.index<
という関数を生成します。
上記ファイルの内容が以下のようだとすると

@(customer: Customer, orders: Seq[Order])
 

Welcome @customer.name!

    @orders.map { order =>
  • @order.title
  • }

これはどのScalaコードからでも、下記のように呼び出せます。
val html = views.html.Application.index(customer, orders)

なお、テンプレートファイルの1行目に記載してあるものは、Scala関数の引数とのこと。テンプレートを呼び出す際にも、関数を呼び出すのと同じように、引数に値を渡すんですねー。


"@"キャラクタ

テンプレート上の@は、Scalaコードの始まりと見なされます。
明示的に終了を記述する必要はありません。

ただし、マルチトークン(?)なScalaコードを記述したい場合は、
@(Scalaコード1 + Scalaコード2)のようにかっこでくくる必要があります。

また、{}を使って、複数のステートメントを書くこともできます。

@は特別なキャラクタなので、エスケープする場合は、

@@

と@を重ねる形でエスケープします。


テンプレートパラメータ
テンプレートは単純な関数であるため、パラメータが必要です。
パラメータは、テンプレートファイルの1行目に記述される必要があります。

デフォルト値も使えます。
パラメータグループも使えます。
インプリシットパラメータも使えます。


※その他は今のところ使わなさそうなので省略