そんなあなたに ExceptionMapper を使う方法を。
使い方が変わったようなので新旧書いときます。(大体同じようなことはしてますが全く同じではないので注意)
※RESTEasy 2.3 の方は EJB との組み合わせに問題がある・・・・ので、できれば RESTEasy 3 の方がおすすめです。
□WildFly 8.0.0.Beta1 & RESTEasy 3.0.4.Final
@Provider□JBoss AS 7.1.x & RESTEasy 2.3.x
public class ValidationExceptionHandler implements
ExceptionMapper<ResteasyViolationException> {
@Override
@Produces(MediaType.APPLICATION_JSON)
public Response toResponse(ResteasyViolationException exception) {
ValidateMessage errors = new ValidateMessage();
for (ResteasyConstraintViolation violation : exception.getViolations()) {
errors.getMessages().add(
new Message(String.format("%s:%s:%s:%s", violation
.getPath(), violation.getConstraintType().name(),
violation.getValue(), violation.getMessage())));
}
return Response.status(Status.BAD_REQUEST).entity(errors).build();
}
}
@Provider
public class ValidationExceptionHandler implements
ExceptionMapper<MethodConstraintViolationException> {
@Override
@Produces({ MediaType.APPLICATION_JSON })
public Response toResponse(MethodConstraintViolationException ex) {
ValidateMessage errors = new ValidateMessage();
for (MethodConstraintViolation<?> violation : ex
.getConstraintViolations()) {
errors.getMessages().add(
new Message(String.format("%s:%s:%s:%s", violation
.getMethod().getName(), violation
.getParameterName(), violation.getInvalidValue(),
violation.getMessage())));
}
return Response.status(Status.BAD_REQUEST).entity(errors).build();
}
}
□JSON 出力のためのドメインクラス
@XmlRootElement(name = "validate_message")
public class ValidateMessage implements Serializable {
private static final long serialVersionUID = 1L;
private List<Message> messages = new ArrayList<Message>();
public static class Message {
private String message;
public Message() {
}
public Message(String message) {
this.message = message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
@XmlElementWrapper(name = "messages")
@XmlElement(name = "message")
public List<Message> getMessages() {
return messages;
}
public void setMessages(List<Message> messages) {
this.messages = messages;
}
}
□pom.xml(RESTEasy 3.0.4.Final)
<dependency>□pom.xml(RESTEasy 2.3.x)
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-validator-provider-11</artifactId>
<version>3.0.4.Final</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-hibernatevalidator-provider</artifactId>
<version>2.3.7.Final</version>
</dependency>