はじめに
この記事はSTSを利用した自作アノテーションの作成方法を記したものです。
以下のバージョンでの動作を確認しています。
- Pleiades All in One Eclipse 2021
- Spring Tool Suite (STS) 4.12.0
今回は「正しいタイムスタンプ形式かどうか」をチェックする自作アノテーションを作成してみたいと思います。
注釈(アノテーション)型の作成
-
「Ctrl + N」もしくは、「ファイル → 新規 → その他」からウィザードを立ち上げます
-
名前を記載してください。バリデーション名になるため何を入力チェックするのかが分かりやすいモノであるべきでしょう。
-
@Rentention
とはアノテーションが影響する範囲です。 -
@Target
とはアノテーションをつける対象。いわゆる入力チェックを行う対象となります。
アノテーションの中身
アノテーションとロジックの2クラス作成する必要があります。
@Documented
@Retention(RUNTIME)
@Target(FIELD)
// アノテーションで制約(チェック)したい具体的なロジックを記述したクラスを指定
@Constraint(validatedBy = {DateValidImp.class})
public @interface DateValid {
String message() default "{0}は日付時刻として許可された形式ではありません。";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ FIELD })
@Retention(RUNTIME)
@Documented
public @interface List {
DateTime[] value();
}
}
ウィザードで設定した項目でコードが生成されているはずです。
@Constraint
や@ groups()`は生成できないので追記してください。
public class DateValidImp implements ConstraintValidator<DateValid, String> {
private static final String FORMAT = "yyyy/MM/dd HH:mm:ss";
@Override
public void initialize(DateValid constraintAnnotation) {
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if(value == null || value.isEmpty()) {
return true;
}
try {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern(FORMAT);
dtf.format(LocalDateTime.parse(value, dtf));
return true;
} catch(DateTimeException e) {
return false;
}
}
}
こちらは入力チェック部分であるロジックを定義する部分です。
isValidメソッドのvalueが対象フィールドの値となります。
あとはどのようにtrueとfalseにするかを考えればよいと言うことです。
Formからの呼び出し
/** 登録日時 */
@NotEmpty
@DateTime
private String insertTimestamp;
呼び出し方は、@Target
の引数に合わせる必要がありますが、今回はFIELD
を指定しているため、上記の記述で実行時にチェックされます。