import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import javax.validation.Path;
import javax.validation.constraints.NotNull;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static java.util.Arrays.asList;
@Provider
public class ValidationExceptionMapper implements ExceptionMapper<ConstraintViolationException> {
private <T> List<T> mergeList(@NotNull List<T> l1 , @NotNull List<T> l2 ) {
return new ArrayList<T>(l1) {{addAll(l2);}};
}
@Override
public Response toResponse(final ConstraintViolationException exception) {
Map<Path,List<String>> errors =
exception.getConstraintViolations()
.stream()
.collect(
Collectors.toMap(
ConstraintViolation::getPropertyPath,
cv -> asList(cv.getMessage()),
this::mergeList
)
);
return Response.status(Response.Status.BAD_REQUEST)
.entity(errors)
.build();
}
}