テック-playframework

Playframework application.confに環境変数をbindする

環境ごとに異なる設定値をapplication.confに設けます。 OSの環境変数設定 ~/.bash_profileとかに、 export SECRET_KEY="****" と記述しておく。source ~/.bash_profileしておこう。 application.confの記述 環境変数は${?varName}で読み込めます。envvalの…

Scala Playframework S3にファイルアップロードを行う

2.x系のAWS SDK for JavaでScala + Playframework + S3アップロードを行ったのでメモしておきます。 AWS SDK for Java 2.x AWS SDK for Java 2.0 開発者ガイド - AWS SDK for Java バージョン 2 依存ライブラリの導入 僕の環境では40分ほどbuildに時間を要し…

Playframework データアクセスするRepositoryクラスのDependencyInjection

PlayでAnornを使用していて、RepositoryクラスをDIした時のメモ。といってもAnormは関係ない。 Repositoryクラス 差し替え可能であること前提で抽象化するようtraitを用意しておく。 Trait trait ShopRepositoryTrait { def withBegin():ShopRepository def …

Vue.jsでJsonと画像をmultipartでPlayframeworkにPOSTする

WebAPIとして動作しているPlayframeworkにmultipartでJsonとファイルデータを送信します。 Vue側の実装 template axiosでPOSTするので、formにはmultipartをつけず、prevent指定でページロードしないように制御する。 <template> <form> <input type="text" v-model="shopMame"> <input @change="changeFile" type="file" name="upfile[]" multiple accept="image/*" /> </form></template>

Playframework 複雑なJsonデータをオブジェクトにmappingまたはForm bind、validateする

WebAPIとして動作しているPlayframeworkのJsonデータのパースについて。 Jsonデータは、 { "shopName":"Let it Ride", "position":{ "lat":35.66530148846749, "lng":139.41634567694945 }, "testArray":[1,2,3,4] } のように入れ子、または配列のデータを含…

書籍:Java/Scalaフレームワーク Play Framework入門

Playframeworkについての入門書は以外とあまり出てなくて、日本語で書かれた出版社から出版された書籍は多分この2冊になると思う。 しかしながら、徹底入門の方は2013年末出版のPlayのバージョンが低い & Javaベースで書かれた本なので、新しいバージョンに…

Playframework pac4jを使用したTwitter、GitHubソーシャルログイン

pac4jとは? pac4jはrubyでのOmniAuthのようなJavaで書かれた横断的なソーシャルログインライブラリ。 pac4j: security for Java https://github.com/pac4j/play-pac4j Scala + Playframeworkでも利用できるので、TwitterとGitHubのソーシャルログインを試し…

Playframework フォームバリデーションと表示整形、ユニットテストについて

バリデーションの定義 Formオブジェクト生成の定義に記述する。 Form{ mapping( "password" -> nonEmptyText.verifying(passwordCheckConstraint), "mail" -> email, "tel" -> nonEmptyText(maxLength = 13, minLength = 10).verifying(error="不正な番号で…

Scala PlayframeworkのController、Actionとは?

PlayframeworkのControllerのメソッド、Action{}とはなんぞや?の整理。 def index() = Action{ implicit request => Ok("Hello World") } 自分なりの解釈なので、間違ってたらごめんなさい。 Actionの定義 Action.scalaのActionBuildertraitのapplyメソッド…

PlayFramework Actionメソッドを拡張した独自アクションを作成する

例えば、各コントローラー、メソッド単位で認可の判断をする場合など、メソッド側にパターンマッチを書いてももちろんいいんだけど、以下のようにActionメソッドを拡張したメソッドに渡して透過的に確認することもできる。 def index() = SignedAction{ impl…

PlayFramework Anormを使用してDBへ問い合わせを行う

AnormはJDBCインスタンスを利用して、シンプルなDBレコード操作を提供する。 JDBCで書くSQLとの違いは、 ScalaオブジェクトにマッピングするParserを定義することで、ユーザが定義したcase class型のListを作成することが簡略化できる。 PreparedStatementの…

PlayFramework JSからのプリフライトリクエストを検証する

CSRFとプリフライトリクエスト PlayFrameworkは通常の入力フォームからのリクエストはCSRFFileterが常備されていてhelperでform生成している限り問題なく対策できるんだけど、JSからのPOSTメソッドなんかにCSRFTokenを付与して検証するのは結構手間。 いくら…

PlayFramework API用Jsonの出力

PlayFrameworkでWebAPIとして動作するJsonを出力する。 基本形 OkメソッドにJsonValueオブジェクトを渡せば、'Content-Type: application/json'が吐かれる。 Ok( data:JsonValue ) 以下、JsonValueの作成方法を紹介します。 文字列から生成 var jsonValue = …

PlayFramework テスト用データベースを使用したControllerユニットテストとE2Eテスト

データベースインスタンスを必要とするControllerのユニットテストとE2Eテストを作成する。 Controllerのユニットテスト Specクラスの前処理 テスト用データベースの定義を記述。 以下はh2のインメモリデータベースをPostgreSQLモードで起動したものをテスト…

PlayFramework JDBCとEvolutionsマイグレーションの導入

PlayFrameworkからデータベースを扱う為、JDBCドライバとマイグレーションツールEvolutionsを導入する。 依存ライブラリの導入 build.sbt libraryDependencies += jdbc libraryDependencies += "org.postgresql" % "postgresql" % "42.2.12" libraryDependen…

PlayFramework POSTのControllerテスト

PlayFrameworkのPOSTのControllerテストを作成する。 bodyはJSONではなく一般のkey=valueのフォームデータをPOSTした形式とする。 FakeRequest FakeRequestはwithBodyを追記してbuildする。 bodyの内容はcontrollerで受け取るrequest.bodyと同等の形式を渡せ…

PlayFramework cookie送受信のcontrollerテスト

PlayFrameworkのcontrollerテストでcookieの送受信を行う サーバからのset-cookieヘッダーを確認する。 レスポンスされたFutureインスタンスからcookies()でアクセスできる。get("cookie名")でOption[Cookie]が取得できるので、unwrapして値を確認することが…