The Java EE 7 Tutorial
31.2 Validating Resource Data with Bean Validation
JAX-RS supports the Bean Validation to verify JAX-RS resource classes. This support consists of:
-
Adding constraint annotations to resource method parameters
-
Ensuring entity data is valid when the entity is passed in as a parameter
31.2.1 Using Constraint Annotations on Resource Methods
Bean Validation constraint annotations may be applied to parameters for a resource. The server will validate the parameters and either pass or throw a javax.validation.ValidationException
.
@POST @Path("/createUser") @Consumes(MediaType.APPLICATION_FORM_URLENCODED) public void createUser(@NotNull @FormParam("username") String username, @NotNull @FormParam("firstName") String firstName, @NotNull @FormParam("lastName") String lastName, @Email @FormParam("email") String email) { ... }
In the preceding example, the built-in constraint @NotNull
is applied to the username
, firstName
, and lastName
form fields. The user-defined @Email
constraint validates that the email address supplied by the email
form field is correctly formatted.
The constraints may also be applied to fields within a resource class.
@Path("/createUser") public class CreateUserResource { @NotNull @FormParam("username") private String username; @NotNull @FormParam("firstName") private String firstName; @NotNull @FormParam("lastName") private String lastName; @Email @FormParam("email") private String email; ... }
In the preceding example, the same constraints that were applied to the method parameters in the previous example are applied to the class fields. The behavior is the same in both examples.
Constraints may also be applied to a resource class's JavaBeans properties by adding the constraint annotations to the getter method.
@Path("/createuser") public class CreateUserResource { private String username; @FormParam("username") public void setUsername(String username) { this.username = username; } @NotNull public String getUsername() { return username; } ... }
Constraints may also be applied at the resource class level. In the following example, @PhoneRequired
is a user-defined constraint that ensures that a user enters at least one phone number. That is, either homePhone
or mobilePhone
can be null, but not both.
@Path("/createUser") @PhoneRequired public class CreateUserResource { @FormParam("homePhone") private Phone homePhone; @FormParam("mobilePhone") private Phone mobilePhone; ... }
31.2.2 Validating Entity Data
Classes that contain validation constraint annotations may be used in method parameters in a resource class. To validate these entity classes, use the @Valid
annotation on the method parameter. For example, the following class is a user-defined class containing both standard and user-defined validation constraints.
@PhoneRequired public class User { @NotNull private String username; private Phone homePhone; private Phone mobilePhone; ... }
This entity class is used as a parameter to a resource method.
@Path("/createUser") public class CreateUserResource { ... @POST @Consumers(MediaType.APPLICATION_XML) public void createUser(@Valid User user) { ... } ... }
The @Valid
annotation ensures that the entity class is validated at runtime. Additional user-defined constraints can also trigger validation of an entity.
@Path("/createUser") public class CreateUserResource { ... @POST @Consumers(MediaType.APPLICATION_XML) public void createUser(@ActiveUser User user) { ... } ... }
In the preceding example, the user-defined @ActiveUser
constraint is applied to the User
class in addition to the @PhoneRequired
and @NotNull
constraints defined within the entity class.
If a resource method returns an entity class, validation may be triggered by applying the @Valid
or any other user-defined constraint annotation to the resource method.
@Path("/getUser") public class GetUserResource { ... @GET @Path("{username}") @Produces(MediaType.APPLICATION_XML) @ActiveUser @Valid public User getUser(@PathParam("username") String username) { // find the User return user; } ... }
As in the previous example, the @ActiveUser
constraint is applied to the returned entity class as well as the @PhoneRequired
and @NotNull
constraints defined within the entity class.
31.2.3 Validation Exception Handling and Response Codes
If a javax.validation.ValidationException
or any subclass of ValidationException
except ConstraintValidationException
is thrown, the JAX-RS runtime will respond to the client request with a 500 (Internal Server Error) HTTP status code.
If a ConstraintValidationException
is thrown, the JAX-RS runtime will respond to the client with one of the following HTTP status codes:
-
500 (Internal Server Error) if the exception was thrown while validating a method return type
-
400 (Bad Request) in all other cases