package io.dropwizard.jersey.jackson;

import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonProcessingException;
import io.dropwizard.jersey.errors.ErrorMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class JsonProcessingExceptionMapper implements ExceptionMapper<JsonProcessingException> {
    private static final Logger LOGGER = LoggerFactory.getLogger(JsonProcessingExceptionMapper.class);

    @Override
    public Response toResponse(JsonProcessingException exception) {
        /*
         * If the error is in the JSON generation, it's a server error.
         */
        if (exception instanceof JsonGenerationException) {
            LOGGER.warn("Error generating JSON", exception);
            return Response.serverError().build();
        }

        final String message = exception.getOriginalMessage();

        /*
         * If we can't deserialize the JSON because someone forgot a no-arg constructor, it's a
         * server error and we should inform the developer.
         */
        if (message.startsWith("No suitable constructor found")) {
            LOGGER.error("Unable to deserialize the specific type", exception);
            return Response.serverError().build();
        }

        /*
         * Otherwise, it's those pesky users.
         */
        LOGGER.debug("Unable to process JSON", exception);
        return Response.status(Response.Status.BAD_REQUEST)
                .type(MediaType.APPLICATION_JSON_TYPE)
                .entity(new ErrorMessage(Response.Status.BAD_REQUEST.getStatusCode(), "Unable to process JSON"))
                .build();
    }
}

@@ -609,16 +609,239 @@
 .class);
+%0A    private final boolean showDetails;%0A%0A    public JsonProcessingExceptionMapper() %7B%0A        this(false);%0A    %7D%0A%0A    public JsonProcessingExceptionMapper(boolean showDetails) %7B%0A        this.showDetails = showDetails;%0A    %7D
 %0A%0A    @O
@@ -1766,32 +1766,209 @@
 N%22, exception);%0A
+        final ErrorMessage errorMessage = new ErrorMessage(Response.Status.BAD_REQUEST.getStatusCode(),%0A                %22Unable to process JSON%22, showDetails ? message : null);%0A
         return R
@@ -2090,21 +2090,17 @@
 .entity(
-new E
+e
 rrorMess
@@ -2106,79 +2106,8 @@
 sage
-(Response.Status.BAD_REQUEST.getStatusCode(), %22Unable to process JSON%22)
 )%0A  

Allow JsonProcessingExceptionMapper to optionally show detailed error message