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 ""; // 使わない
...
}