この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Javaで条件付きチェックを実装するにあたり、Bean Validationのバリデーショングループを使ってみました。
※Spring Frameworkを使用しています。
■ 【グループ】
検証グループのインターフェースを作ります。
public interface Role {
interface Admin {}
interface General {}
}
■ 【Bean】
チェック対象のフィールドにグループを指定します。
public class ValidationTestBean {
private String role;
@NotEmpty(groups = Admin.class)
@Size(min = 1, max = 30, groups = General.class)
private String name;
// getter,setter省略
}
■ 【コントローラ】
コントローラからバリデータを呼び出します。
@Controller
@RequestMapping({ "/validation/test" })
public class ValidationTestController {
@Autowired
private Validator validator;
@RequestMapping(value = "confirm", method = GET)
public String confirm(@ModelAttribute("bean") ValidationTestBean bean,
Errors errors, Model model) {
// 検証グループ生成
Object[] groups = createValidationGroups(bean);
// 入力チェック
ValidationUtils.invokeValidator(validator, bean, errors, groups);
if (errors.hasErrors()) {
return "validation/test/input";
}
return "validation/test/confirm";
}
private Object[] createValidationGroups(ValidationTestBean bean) {
List<object> groups = new ArrayList<object>();
// 条件によりグループを追加
if ("admin".equals(bean.getRole())) {
groups.add(Admin.class);
} else {
groups.add(General.class);
}
return groups.toArray();
}
}
createValidationGroupsメソッドでグループを追加しています。
このとき、条件により異なるグループを設定することにより、Beanで指定したグループのみバリデーションを実行することができます。
今回割愛しましたが、グループは省略したり複数指定したりも可能です。
グループを活用することにより条件付きチェックをできるだけアノテーションで実装することができました。