こんな感じに、URLに;AUTO_SERVER=TRUEをくっつけるだけでいける。
jdbc:h2:./h2/db/nablarch_example;AUTO_SERVER=TRUE
アプリ実行中にIntelliJから繋いで状態確認するレベルであればこれで問題なさそう。
Featuresによると、最初の接続を閉じた場合に実行中のトランザクションがロールバックされる的なこと書いてあるので、使い方には注意が必要かな。
@Valueアノテーションを使ってプロパティの値をインジェクションする場合、デフォルトではプレフィックスに${を指定する必要がある。
Javaで書いてる場合は問題ないけど、Kotlinを使うと文字列内の$は変数を展開するために使うので下のコードのようにエスケープしないとダメで残念な感じになります。
@Value("\${target.host}") private val host:String
プレフィックスはこんな感じに、PropertySourcesPlaceholderConfigurerを使うことで変更できます。
@Bean open fun propertyConfigurer() : PropertySourcesPlaceholderConfigurer { val propertySourcesPlaceholderConfigurer = PropertySourcesPlaceholderConfigurer() propertySourcesPlaceholderConfigurer.setPlaceholderPrefix("&{") eturn propertySourcesPlaceholderConfigurer }
これで、$のエスケープが不要になります。
@Value("&{target.host}") private val host:String
参考にした情報です。
stackoverflow.com
※ConfigurationPropertiesを使えばValueアノテーション使わなくていいので、単純にこの問題を回避できる。
そもそも、プロパティの値を保持するBeanはJavaで書いたほうが幸せになりそうな気もする。
IntelliJさんの、Project Viewでパッケージの表示状態をCompact Empty Middle packagesな状態にしていると、間のパッケージにファイルを作成することができません。
例えば、下の画像の状態でdomaパッケージを選択してファイルを作ると、domaの下に作られます。
これを、siosio配下に作るかdoma配下に作るかを選択できるようにする方法です。
Find ActionからRegistry画面を開きます。
「projectView.choose.directory.on.compacted.middle.packages」のチェックをオンにすることで、作成するパッケージを選択できるようになります。
どこに作るか聞いてくれます。いい感じです。
おわり。
Jacksonのkotlin対応モジュール をSpring Bootで使ってみる。
Spring Boot:1.3.5
Jackson:2.6.6
Gradleだとこんな感じですね
compile 'com.fasterxml.jackson.module:jackson-module-kotlin:2.6.6'
Developing Spring Boot applications with Kotlinを参考にして追加してあげる。
@Bean open fun objectMapperBuilder(): Jackson2ObjectMapperBuilder = Jackson2ObjectMapperBuilder().modulesToInstall(KotlinModule())
Jsonがマッピングされたdata classを文字列表現で返すだけのシンプルな実装です。
@RestController @RequestMapping("test") open class Controller { @RequestMapping(consumes = arrayOf(MediaType.APPLICATION_JSON_VALUE), method = arrayOf(RequestMethod.POST)) @ResponseBody fun post(@RequestBody param: Param): String { return param.toString() } }
いい感じに動きました。
curl -H "Content-Type: application/json" -X POST -d '{"str": "12345", "num": 100}' http://localhost:8080/test Param(str=12345, num=100)
Spring Boot1.4系になると、 jackson-module-kotlinを追加してあげるだけでいい感じに動いてくれます。
上の例で書いたような、KotlinModuleの設定がいらなくなる感じです。
この辺の実装が追加されてるからですかね。
spring-framework/Jackson2ObjectMapperBuilder.java at master · spring-projects/spring-framework · GitHub
おわり。
JBeretでは、ロジックでジョブ定義を構築することが出来るみたいなので試してみた。
これを使うと、xmlでジョブ定義をすることなくバッチを実行することができるようになる。
ただし、JSRで定められているわけではないので、バッチ実行時にJBeretを直接扱う必要がある。
ドキュメントはこちら→Programmatic Job Definition with Java | JBeret User Guide
JobBuilderやStepBuilderを使ってジョブ定義を構築していく感じになる。
batchletやreaderなんかに指定する名前は、xmlに定義する時と同じようにBeanの名称を設定する。
この例だと、sample-jobジョブに2つのステップがあって、batchlet-step -> chunk-stepの順に実行される。
val job = JobBuilder("sample-job") .step( StepBuilder("batchlet-step") .batchlet("sampleBatchlet") .next("chunk-step") .build() ) .step( StepBuilder("chunk-step") .reader("sampleItemReader") .writer("sampleItemWriter") .itemCount(2) .build() ) .build()
ジョブを実行するには、BatchRuntimeから取得したJobOperatorをJBeretの実装(JobOperatorImpl)にダウンキャストしてあげる。
JobOperatorImplには、JobBuilderで構築したJobオブジェクトを指定してジョブを実行するメソッドが用意されているので、それを使ってジョブを実行してあげる。
val jobOperator = BatchRuntime.getJobOperator() as JobOperatorImpl
val executionId = jobOperator.start(job, null)
ソースは全体はこちら→GitHub
おわり。
Gradleのグループ化機能を使うと同じ種類位のタスクをグループでまとめられるようになる。
IntelliJを使っている場合、Gradleウィンドウではグループ毎にタスクがまとめられて表示されるので、ビルドスクリプト側でグループ化しておくとIntelliJさんでもタスクが探しやすくなる感じです。
タスクをグループ化するには、タスクのgroupプロパティにグループ名を設定します。
この場合、run_batchletとrun_chunkのタスクがapplicationグループとなる。
task run_batchlet(type: JavaExec) { classpath = sourceSets.main.runtimeClasspath main = 'org.jberet.se.Main' args 'batchlet-next-element-sample' } task run_chunk(type: JavaExec) { classpath = sourceSets.main.runtimeClasspath main = 'org.jberet.se.Main' args 'chunk-next-element-sample' } [run_batchlet, run_chunk]*.group = 'application'
applicationグループにまとまってますね。
こちらも、ちゃんとグループにまとめられています。
ちなみにタスクの説明は、タスクのdescriptionプロパティに設定してあげると表示されるようになります。
Application tasks ----------------- installApp - Installs the project as a JVM application along with libs and OS specific scripts. run - Runs this project as a JVM application run_batchlet run_chunk
おわり。