動いた！TomcatでJSF+CDI  さらにBeanValidation

# はじめに
前回までにTomcatでJSF+CDIを動かすための環境設定と、動作確認用のアプリを作成しました。
今回は、これに機能追加して`BeanValidation`を動かしたいと思います。

前回はこちら -> [「動いた！TomcatでJSF+CDI(環境設定編)」](https://qiita.com/park3taro/items/349ec5a14c5ac5ecf405)


環境はいつもどおり、以下のとおりです。

* mac os
* java13
* Eclipse for Enterprise Java Developers (2020-09)
* Tomcat 9.0.39

# 実装
実装手順は以下とおりです。
前回の動作確認アプリに機能追加していきます。

* mavenの設定で、`BeanValidation`のライブラリを導入します。
* BackingBeanの属性にアノテーションを追加
* メッセージの追加

## mavenの設定
`myfaces`の`ExtVal`を利用します。これが、`validation-api-1.0.0GA`を参照しているので`hibernate-validator`は`少し古めの4.3.2.Final`を利用します。

```xml:pom.xml
<dependency>
    <groupId>org.apache.myfaces.extensions.validator.validation-modules</groupId>
    <artifactId>myfaces-extval-bean-validation</artifactId>
    <version>2.0.8</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>4.3.2.Final</version>
    <scope>runtime</scope>
</dependency>
```

## アノテーションの追加
前回の動作確認アプリに機能追加していきます。
ログインとパスワードに必須のバリデータを追加します。
まずは、IndexBeanにアノテーション(`@NotNull`)を追加します。

```java:InexBean.java
public class IndexBean implements Serializable {

    @NotNull
    private String loginId;

    @NotNull
    private String password;

    // 以下省略
}
```

次にxhtml（抜粋）です。

```html:index.html
<body>
    <h:messages escape="true" id="messages" showDetail="false" closable="true"/>
    <h:form id="form">
        <br/>
        <h:inputText value="#{index.loginId}" label="ユーザー名" ph:placeholder="Username" /><br/>
        <h:inputSecret value="#{index.password}" label="パスワード" ph:placeholder="Password" /><br/>
        <h:commandButton action="#{index.loginEvent()}" value="ログイン" update="@form" />
    </h:form>
</body>
```

ここまでで、画面を表示してログインボタンを押下するおt、以下のようになります。

<img width="260px" alt="サンプルアプリ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701083/02b4beb3-a6d7-4313-37ad-eb396cbb8efe.png"/>

これでも良いのですが、メッセージを日本語にしたいと思います。
## ValidationMessage_ja.properties

src/main/resources配下にpropertiesを作成します。

```properties:ValidationMessage_ja.properties
javax.faces.validator.BeanValidator.MESSAGE={0}
javax.validation.constraints.NotNull.message={1}は必須です
```
詳しい説明はしませんが、１行目はJSFがBeanValidationを実行したときに使うメッセージの表示形式です。{0}にメッセージが設定され画面に表示されます。
2行目はメッセージです。キーは、BeanValidationの`NotNull`に対応しています。{1}はxhtmlのlabel属性で指定した値が設定されます。
この辺りはJSFで制御されています。

このファイルをJSFに認識させるために`faces-config.xml`に追加します。

```xml:faces-config.xml
<application>
    <message-bundle>ValidationMessages</message-bundle>
</application>
```

# 完成
上記まで実装したら画面を表示して、ログインボタンを押下します。
<img width="280px" alt="サンプルアプリ" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701083/ae1ca0f9-1254-d6a4-62dc-8f343e6497cb.png"/>

できた〜！

以上です。


# その他メモ
BeanVaidationはbval-jsrでもイケます。
このときはjavaee-api-8.0.4.jarをtomcat/libの下に配置します。コンパイルに必要なのでpomにも追加します。(`<scope>compile</scope>`では動きません。tomcat/libに配置します。）
ここまでやるならばTomEEの方がよいですね。

```xml:pom.xml
<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>8.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.bval</groupId>
    <artifactId>bval-jsr</artifactId>
    <version>2.0.5</version>
</dependency>

```

# 参考
[MyFaces ExtVal](https://myfaces.apache.org/extensions/validator20/validation-modules-project/myfaces-extval-bean-validation/index.html)