Bean Validation

★基本用法

import javax.validation.Valid;

import javax.validation.constraints.*;

public class InputBean {

@NotNull(message="xxx") //空はチェックしない

@Size(min=2, max=5, message="{min}から{max}文字の間")

@Digits(integer=3, fraction=2,

message="整数{integer}桁、小数{fraction}桁まで")

@Pattern(regexp="123.*", message="xxx")

@DecimalMax(value="30", message="xxx")

@DecimalMin(value="20", message="xxx")

@Max(value=30, groups=MyGroup.class, message="xxx")

@Min(value=20, message="xxx")

@DecimalMax.List({

@DecimalMax(value="30", message="xxx"),

@DecimalMax(value="20", message="xxx")

})

private String data;

// setter・getter

@Valid // 親子関係のチェック

List<InputSubBean> beans = new ArrayList<InputSubBean>();

{

beans.add(new InputSubBean(new BigDecimal("1.2"))); //×

beans.add(new InputSubBean(new BigDecimal(12345)));

beans.add(new InputSubBean(new BigDecimal(123456))); //×

}

}

public class InputSubBean {

@Digits(integer=5, fraction=0, message="xxx")

@NotNull

private BigDecimal data;

// setter・getter・コンストラクタ

}

public interface MyGroup {

}

Bean validation

エラーメッセージ:javax.validation.constraints.[Annotation].message=...

Hibernate Validator

エラーメッセージ:org.hibernate.validator.constraints.[Annotation].message=...

Servlet

import javax.validation.ConstraintViolation;

import javax.validation.Validation;

import javax.validation.Validator;

import javax.validation.ValidatorFactory;

InputBean ib = new InputBean();

ib.setData(request.getParameter("data"));

ValidatorFactory vf = Validation.buildDefaultValidatorFactory();

Validator v = vf.getValidator();

Set<ConstraintViolation<InputBean>> result = v.validate(ib);

//Set<ConstraintViolation<InputBean>> result = v.validate(ib, MyGroup.class);

String message = "";

for(ConstraintViolation<InputBean> cv : result){

message += cv.getInvalidValue() + ":" + cv.getMessage() + "<br />";

}

request.setAttribute("message", message);

request.getRequestDispatcher("index.jsp").forward(request, response);

JSP

${message}

<form action="validate">

<input type="text" name="data" value="${param.data}" >

<input type="submit" value="送信">

</form>

★Bean Validation 1.1 (Java EE7) new feature

・CDI alignment

・Method validation

・Integration with JAX-RS

・Error messages using EL expressions

★Bean Validation 1.1 in JAX-RS

サンプル1

public class Person {

@NotNull

@Pattern(regexp = "[0-9]+")

private Integer id;

@NotNull

@Size(min = 2, max = 30)

private String name;

...

}

@POST

public Response validatePerson(@Valid Person person) {

...

}

サンプル2

@POST

@Path("create")

@Consumes(MediaType.APPLICATION_FORM_URLENCODED)

public Response createPerson(

@FormParam("id")

@NotNull(message = "{person.id.notnull}")

@Pattern(regexp = "[0-9]+", message = "{person.id.pattern}")

String id,

@FormParam("name")

@NotNull(message = "{person.name.notnull}")

@Size(min = 2, max = 30, message = "{person.name.size}")

String name) {

Person person = new Person(id, name);

...

return Response

.status(Response.Status.CREATED)

.entity(person)

.build();

}

ValidationMessages.properties / ValidationMessages_ja.properties

person.id.notnull=...

person.id.pattern=...

person.name.notnull=...

person.name.size=... between {min} and {max} ...

★カスタムValidation

※@Requiredは@NotNullと@Size(min=1)に相当

書き方1

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

import javax.validation.Constraint;

import javax.validation.Payload;

@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })

@Retention(RetentionPolicy.RUNTIME)

@Constraint(validatedBy={RequiredValidator.class})

public @interface Required {

String message() default "xxx";

Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

@Target({ ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE })

@Retention(RetentionPolicy.RUNTIME)

@interface List {

Required[] value();

}

}

import javax.validation.ConstraintValidator;

import javax.validation.ConstraintValidatorContext;

public class RequiredValidator

implements ConstraintValidator<Required, String>{

public void initialize(Required constraintAnnotation) { }

public boolean isValid(String value,

ConstraintValidatorContext context) {

if(value == null || value.isEmpty()){

return false;

}

return true;

}

}

書き方2

@Size(min=1, message="xxx")

@NotNull(message="xxx")

@Constraint(validatedBy={})

public @interface Required {

String message() default ""; // 使わない

...

}