参考文献
- Bean Validation specification
http://beanvalidation.org/1.1/spec/ - Jersey User Guide: 18. Bean Validation Support
https://jersey.java.net/documentation/latest/bean-validation.html - Jersey User Guide: 7.3. WebApplicationException and Mapping Exceptions to Responses
https://jersey.java.net/documentation/latest/user-guide.html#d0e6664
Bean Validationを依存関係に追加する
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-bean-validation</artifactId>
</dependency>
(versionはBOMで指定されたものを使うので書かない)
リクエストエンテティJSONにアノテーションで制約を付与する
class RequestBean {
@NotNull
private String propertyA;
...
}
リソースクラスのメソッドにアノテーションで制約を付与する
@Path("/")
class MyResourceClass {
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void doSomething(@Valid @NonNull RequestBean user) {
...
}
}
ConstraintViolationExceptionのExceptionMapperを実装する
@Provider
public class ConstraintViolationExceptionMapper implements ExceptionMapper<ConstraintViolationException> {
@Override
public Response toResponse(ConstraintViolationException ex) {
return Response.status(Status.BAD_REQUEST)
.entity(buildEntityFrom(ex))
.type(MediaType.APPLICATION_JSON_TYPE)
.build();
}
ConstraintViolationの各パラメータには以下の値が格納されている:
- rootBean: リソースオブジェクト
- leafBean: リクエストエンテティBean
- propertyPath: <メソッド名>.arg0.<リクエストエンテティBeanのプロパティ名>
(リクエストエンテティ自体がnullの場合は <メソッド名>.arg0 )
(Jersey User Guide:18.7.1. ValidationErrorに記載されているように、
デフォルトでマッピングする機能もあるので、要件に合うのであればそれを使ってもよい)