normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

JSR 303 Bean Validator を使ってみる

JavaEE6 から? JSR の標準に取り込まれた JSR 303 Bean Validatorを使ってみた。JavaEE5 時代は Hibernate Validator としてOSSとして実装されていたものが JavaEE6 では Bean Validator として標準仕様として取り込まれている(中身の実装はやはり Hibernate Validator だが)。今回は使えるまでの手順ベースで手短にささっと書いてしまうが、参考になれば幸いだ*1

依存ライブラリのインストール

まずは Bean Validator に依存しているライブラリを解決する。本体である validation-api.jar(インターフェース部分) と hibernator-validator.jar(実装部分)はもちろん必要だが、単体環境でBean Validator を利用する場合は el-api.jar や el-impl.jar も必要な点に注意して頂きたい。TomcatGlassFish、JBoss AS 等の AP サーバは独自に el-api.jar, el-impl.jar を持っているが、単体環境で実行する場合はこれらの依存関係も解決してやる必要がある。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.mydomain.sample.study</groupId>
	<artifactId>beanvalidator-sample</artifactId>
	<packaging>jar</packaging>
	<version>0.9.0-SNAPSHOT</version>
	<name>Bean Validator Sample</name>
	<dependencies>
		<!-- http://mvnrepository.com/artifact/javax.validation/validation-api/1.1.0.Final -->
		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>1.1.0.Final</version>
		</dependency>
		<!-- http://mvnrepository.com/artifact/org.hibernate/hibernate-validator/5.0.1.Final -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>5.0.1.Final</version>
		</dependency>
		<!-- http://mvnrepository.com/artifact/javax.el/el-api/2.2 -->
		<dependency>
			<groupId>javax.el</groupId>
			<artifactId>el-api</artifactId>
			<version>2.2</version>
		</dependency>
		<!-- http://mvnrepository.com/artifact/org.glassfish.web/el-impl/2.2 -->
		<dependency>
			<groupId>org.glassfish.web</groupId>
			<artifactId>el-impl</artifactId>
			<version>2.2</version>
		</dependency>
	</dependencies>
</project>

サンプルコード

Javaソースコードを記載する。DTOクラスのプロパティに対し、@Size や @Min のアノテーションを付与してバリデーション属性を指定する。以下の例では @Size で3文字以上かつ20文字以下の文字列を許可文字列とし、エラーメッセージも別途指定してる。また、@Min で0未満の値は入力できないようにしている。

package com.mydomain.sample.study.dto;

import javax.validation.constraints.Min;
import javax.validation.constraints.Size;

public class PersonDto {
	@Size(min = 3, max = 20)
	private String name;

	@Min(value = 0, message = "流石に  0 歳以下は無いと思いますので、{value} は嘘じゃないかと…")
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

以下は PersonDto に対して不正な値を入力したうえでバリデーションを実行するソースコードになる。

package com.mydomain.sample.study;

import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

import com.mydomain.sample.study.dto.PersonDto;

public class Main {
	public static void main(String[] args) {
		PersonDto dto = new PersonDto();
		dto.setAge(-10);
		dto.setName("ああ");

		ValidatorFactory vf = Validation.buildDefaultValidatorFactory();
		Validator v = vf.getValidator();
		Set<ConstraintViolation<PersonDto>> results = v.validate(dto);
		for (ConstraintViolation<PersonDto> result : results) {
			System.out.println(result.getMessage());
		}
	}
}

サンプルの実行

サンプルの実行結果は以下になる。バリデーションが実行されているのが確認できると思う。

6 08, 2013 11:08:19 午前 org.hibernate.validator.internal.util.Version <clinit>
INFO: HV000001: Hibernate Validator 5.0.1.Final
size must be between 3 and 20
流石に  0 歳以下は無いと思いますので、0 は嘘じゃないかと…

*1:自分がちょこちょこ確認するるので備忘録気味