/**
*
*/
package org.minnal.validation.exception;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status.Family;
import javax.ws.rs.core.Response.StatusType;
import javax.ws.rs.ext.ExceptionMapper;
import org.javalite.common.Inflector;
import org.minnal.validation.FieldError;
/**
* @author ganeshs
*
*/
public class ConstraintViolationExceptionHandler implements ExceptionMapper<ConstraintViolationException> {
@Override
public Response toResponse(ConstraintViolationException exception) {
ConstraintViolationException ex = (ConstraintViolationException) exception;
List<FieldError> errors = new ArrayList<FieldError>();
for (ConstraintViolation<?> violation : ex.getConstraintViolations()) {
errors.add(new FieldError(Inflector.underscore(violation.getPropertyPath().toString()), violation.getMessage(), violation.getInvalidValue()));
}
Map<String, List<FieldError>> message = new HashMap<String, List<FieldError>>();
message.put("fieldErrors", errors);
return Response.status(UnprocessableEntityStatusType.INSTANCE).entity(message).build();
}
private static class UnprocessableEntityStatusType implements StatusType {
private static UnprocessableEntityStatusType INSTANCE = new UnprocessableEntityStatusType();
/**
* Singleton constructor
*/
private UnprocessableEntityStatusType() {
}
@Override
public int getStatusCode() {
return 422;
}
@Override
public String getReasonPhrase() {
return "Unprocessable Entity";
}
@Override
public Family getFamily() {
return Family.CLIENT_ERROR;
}
}
}