【SpringMVC】バリデーションチェック

SpringMVCでバリデーションチェックを実施します。
例として、作業時間入力用のクラスがあるとして、それを複数所持するListがあるとし、
JSPでそのListをループし、作業時間入力レコードを複数表示およびチェックします。

  • バリデーションチェックのjarファイル追加
    「【SpringMVC設定】ファイルその4」を参考にpom.xmlにjarファイルを追加する。
  • アノテーション追加
    作業時間入力用のクラスは全て必須項目とするため、「@NotNull」を追加する。

    1public class DayTimeWork implements Serializable {
    2    private static final long serialVersionUID = 1L;
    3 
    4    @NotNull
    5    private String ankenNo;
    6    @NotNull
    7    private String startTime;
    8    @NotNull
    9    private String endTime;
    10 
    11    アクセサメソッドは省略。
    12}

    作業時間入力用のクラスを保持するListには「@Valid」を追加する。
    「@Valid」はネストしたクラスも検証対象とする場合、追加します。

    1public class DayTime implements Serializable {
    2    @Valid
    3    private List<DayTimeWork> dayTimeWork;
    4 
    5    アクセサメソッドは省略。
    6}
  • コントローラーへの設定追加
    Javaコントローラーにバリデーションチェックを実施するための設定を追加する。
    「@Validated」の次の項目にBindingResultを記載しないと
    実行時にValidationExceptionが発生する。

    1@Controller
    2public class InputController {
    3 
    4    @InitBinder
    5    public void initBinder(WebDataBinder binder) {
    6        // bind empty strings as null
    7        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    8    }
    9 
    10    @RequestMapping(value = "/updateDayTime", method = RequestMethod.POST)
    11    public String updateDayTime(
    12            @ModelAttribute(value = "dayTime") DayTime dayTime,
    13            final @Validated DayTime inputDayTime,
    14            BindingResult result,
    15            Model model) {
    16        // 処理省略
    17    }
    18}
  • JSPへの設定追加
    JSPでバリデーションチェック結果を取得する。
    Thymeleafのタグを利用し、全項目内でエラーが1つでもあれば、
    変数errとしてエラーを取得し、表示しています。

    1<form class="form-horizontal" action="#" th:action="@{/updateDayTime}" th:object="${dayTime}" method="post">
    2<fieldset>
    3  <ul th:if="${#fields.hasErrors('*')}">
    4    <li th:each="err : ${#fields.errors('*')}" th:text="${err}">Input is incorrect</li>
    5  </ul>
    6</fieldset>
    7</form>

    Thymeleafのタグを利用し、エラー項目のテキストボックスの枠を赤くしたり、
    入力がない場合、placeholderで「案件番号」という文字を初期表示することも可能。

    1<form class="form-horizontal" action="#" th:action="@{/updateDayTime}" th:object="${dayTime}" method="post">
    2  <table class="table">
    3    <!-- 処理省略 -->
    4    <tr th:each="vc, row : *{dayTimeWork}" >
    5      <td th:class="${#fields.hasErrors('dayTimeWork[__${row.index}__].ankenNo')}? has-error"  align="center">
    6      <input type="text" th:field="*{dayTimeWork[__${row.index}__].ankenNo}" placeholder="案件番号" class="form-control" />
    7      </td>
    8    </tr>
    9  </table>
    10</form>