package ameba.validation; import ameba.message.error.ErrorMessage; import ameba.message.error.ExceptionMapperUtils; import ameba.util.Result; import com.google.common.hash.Hashing; import org.glassfish.jersey.server.validation.internal.LocalizationMessages; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Priority; import javax.inject.Singleton; import javax.validation.ConstraintViolationException; import javax.ws.rs.Priorities; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; import java.util.List; /** * <p>ValidationExceptionMapper class.</p> * * @author icode * */ @Priority(Priorities.USER) @Singleton public class ValidationExceptionMapper implements ExceptionMapper<ConstraintViolationException> { private static final Logger logger = LoggerFactory.getLogger(ValidationExceptionMapper.class); /** * {@inheritDoc} */ @Override public Response toResponse(final ConstraintViolationException exception) { logger.trace(LocalizationMessages.CONSTRAINT_VIOLATIONS_ENCOUNTERED(), exception); Response.Status status = ValidationHelper.getResponseStatus(exception); ErrorMessage errorMessage = ErrorMessage.fromStatus(status.getStatusCode()); errorMessage.setThrowable(exception); errorMessage.setCode(Hashing.murmur3_32().hashUnencodedChars(exception.getClass().getName()).toString()); List<Result.Error> errors = ValidationHelper.constraintViolationToValidationErrors(exception); errorMessage.setErrors(errors); return Response.status(status) .entity(errorMessage) .type(ExceptionMapperUtils.getResponseType()) .build(); } }