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

2018年9月11日火曜日

spring-boot-maven-pluginのboot:runで起動引数を指定する

spring-boot-maven-pluginのboot:run時に起動引数を指定する方法です。

起動引数は、システムプロパティのspring-boot.run.argumentsを使用して指定します。
mvn spring-boot:run -Dspring-boot.run.arguments=[引数]

2018年5月28日月曜日

Spring MVCとThymeleafの組み合わせでcheckboxのデフォルト値を設定する

Spring MVCとThymeleafの組み合わせでcheckboxを使った場合の動きを理解する。

checkboxの値をBooleanで受け取る場合

Form

public class Form {

    private Boolean check;

    // ほかは省略
}

Controller

checkboxの値を確認できるように標準出力に値を出力するだけに
@PostMapping("hello")
public String hello(Form form) {
    System.out.println("form.check = " + form.check);
    return "input";
}

View

<form th:action="@{/hello}" method="post" th:object="${form}">
  <input type="checkbox" th:field="*{check}" />
  <button type="submit">submit</button>
</form>

動かしてみた結果

出力されるhtmlには、checkboxとcheckboxに対応したhiddenが出力されます。このhiddenがあることでcheckboxがチェックされなかった場合でもFormに値が設定されます。(Booleanなのでfalseが設定される)
これは、thymeleafのth:fieldで自動的に出力されます。
<form action="/hello" method="post">
  <input type="checkbox" id="check1" name="check" value="true" /><input type="hidden" name="_check" value="on"/>
  <button type="submit">submit</button>
</form>

checkboxをチェックしないで送信した時は標準出力に↓が出力されます。
form.check = false

ちなみに、th:fieldを使わないと下のようにhiddenが出力されないので、checkboxがチェックされなかった場合はFormには値が設定されないのでnullのままとなります。
<form action="/hello" method="post">
  <input type="checkbox" name="checkbox" />
  <button type="submit">submit</button>
</form>

checkboxの値をBoolean以外で受け取る場合

単一のcheckboxの値をBooleanで受け取ることはないと思うけど、Stringで受け取った場合の動きを確認してみます。

Stringの場合も、Booleanと同じようにth:fieldを使うと、↓が出力されます。だけど、Stringの場合はth:fieldが出力するアンダースコア付きのhiddenに対応していないので、このままだと未チェック時はFormの値はnullのままになります。

<form action="/hello" method="post">
  <input type="checkbox" value="on" id="check1" name="check"/><input type="hidden" name="_check" value="on"/>
  <button type="submit">submit</button>
</form>

未送信時に送信する値は、別途↓のようにhiddenで定義します。デフォルト設定だと、対応するcheckboxのnameの先頭に!をつけた名前でhiddenを定義する必要があります。
プレフィックスの値はWebDataBinderのJavadocが参考になります。
<form th:action="@{/hello}" method="post" th:object="${form}">
  <input type="checkbox" th:field="*{check}" value="on" />
  <input type="hidden" name="!check" value="off" />
  <button type="submit">submit</button>
</form>

これで、未チェック時にはhiddenで指定した値をFormで受け取れるようになります。
form.check = off

2018年4月3日火曜日

Spring BootとFlywayでテーブルなどがあるスキーマに対してマイグレーションを実行する

application.propertiesに下を追加して、既存の状態をバージョン001とすることでマイグレーションが可能になる。
アプリ側のSQLファイルのバージョンは、V002__Create_hoge_table.sqlのようにベースバージョンより大きいバージョンにする。

spring.flyway.baseline-on-migrate=true
spring.flyway.baseline-version=001



なお、デフォルト状態だとFound non-empty schema "PUBLIC" without metadata table!のエラーが出て実行できない。

2017年9月4日月曜日

Spring BootのthymeleafでDate and Time api

Spring BootのThymeleafでDate and Time apiを使う手順

thymeleaf-extras-java8timeを依存に追加

gradleであれば下のように依存を追加する。
Thymeleaf 3.0以上の場合は、3系のバージョンを指定する。
compile 'org.thymeleaf.extras:thymeleaf-extras-java8time:2.1.0.RELEASE'

thymeleafでfomatなどを行う

temporals.formatを使ってフォーマットを行う。
<span th:text="${#temporals.format(nowDateTime, 'yyyy/MM/dd HH:mm:ss')}"></span>

その他

昔は、Java8TimeDialectをBeanとして登録しないとダメだったようですが、下のコミットの対応によりthymeleaf-extras-java8timeを依存に追加するだけでviewで利用できるようになったようです。

https://github.com/spring-projects/spring-boot/commit/c68ffa5ba059781ab2c0fb21eed7a541036e837d

2016年5月4日水曜日

[Spring Boot]ConfigurationPropertiesなクラスからメタデータを生成してpropertiesファイルで補完を有効にする

カスタムな設定値を定義した場合に、application.propertiesでIDEの補完を有効にする方法。

設定値を受け取るクラスを作成

@ConfigurationPropertiesアノテーションが設定されたクラスを作成します。
このクラスの場合、「sample.name」と「sample.hoge」という設定値を保持します。
@Component
@ConfigurationProperties(prefix = "sample")
public class SampleConfiguration {

    private String name;

    private String hoge;

    // setterとgetterは省略
}

メタ情報を生成するためのライブラリをビルドスクリプトに追加

上で作ったConfigurationPropertiesアノテーションが設定されたクラスから、メタ情報(jsonファイル)を生成するためのライブラリをビルドスクリプトに追加します。

基本的にこのリンク先通りに設定してあげます。configuration-metadata-annotation-processor

Gradleの場合は、以下の様になります。(必要な箇所のみ)
buildscript {
  repositories {
    mavenCentral()
    maven { url 'https://repo.spring.io/plugins-release' }
  }
  dependencies {
    classpath 'org.springframework.build.gradle:propdeps-plugin:0.0.7'
  }
}

configure(allprojects) {
  apply plugin: 'propdeps'
  apply plugin: 'propdeps-maven'
  apply plugin: 'propdeps-idea'
  apply plugin: 'propdeps-eclipse'
}

dependencies {
  optional "org.springframework.boot:spring-boot-configuration-processor"
}

compileJava.dependsOn(processResources)

IDEの設定でアノテーションプロセッサーを有効にする

IntelliJ IDEAの場合は、設定画面の「Annotation Processors」から有効化します。

プロジェクトをビルドする

プロジェクトをビルドすることでメタデータが生成されるようになります。
今回の場合は、以下のjsonが出力されます。
{
  "groups": [{
    "name": "sample",
    "type": "com.example.SampleConfiguration",
    "sourceType": "com.example.SampleConfiguration"
  }],
  "properties": [
    {
      "name": "sample.hoge",
      "type": "java.lang.String",
      "description": "ほげ",
      "sourceType": "com.example.SampleConfiguration"
    },
    {
      "name": "sample.name",
      "type": "java.lang.String",
      "description": "名前",
      "sourceType": "com.example.SampleConfiguration"
    }
  ],
  "hints": []
}

IDEで使ってみる

この画像のように、メタデータをもとにプロパティとして使えるものがリスト表示されます。