diff --git a/scm-webapp/src/main/java/sonia/scm/api/FallbackExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/FallbackExceptionMapper.java new file mode 100644 index 0000000000..feb5341e2d --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/FallbackExceptionMapper.java @@ -0,0 +1,43 @@ +package sonia.scm.api; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import sonia.scm.api.v2.resources.ErrorDto; +import sonia.scm.api.v2.resources.ExceptionWithContextToErrorDtoMapper; +import sonia.scm.web.VndMediaType; + +import javax.inject.Inject; +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; +import java.util.Collections; + +@Provider +public class FallbackExceptionMapper implements ExceptionMapper { + + private static final Logger logger = LoggerFactory.getLogger(FallbackExceptionMapper.class); + + private static final String ERROR_CODE = "CmR8GCJb31"; + + private final ExceptionWithContextToErrorDtoMapper mapper; + + @Inject + public FallbackExceptionMapper(ExceptionWithContextToErrorDtoMapper mapper) { + this.mapper = mapper; + } + + @Override + public Response toResponse(Exception exception) { + logger.debug("map {} to status code 500", exception); + ErrorDto errorDto = new ErrorDto(); + errorDto.setMessage("internal server error"); + errorDto.setContext(Collections.emptyList()); + errorDto.setErrorCode(ERROR_CODE); + errorDto.setTransactionId(MDC.get("transaction_id")); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(errorDto) + .type(VndMediaType.ERROR_TYPE) + .build(); + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/api/rest/ContextualExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/rest/ContextualExceptionMapper.java index 43b8a38ccc..d8ab4033d1 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/rest/ContextualExceptionMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/rest/ContextualExceptionMapper.java @@ -13,7 +13,7 @@ public class ContextualExceptionMapper implement private static final Logger logger = LoggerFactory.getLogger(ContextualExceptionMapper.class); - private ExceptionWithContextToErrorDtoMapper mapper; + private final ExceptionWithContextToErrorDtoMapper mapper; private final Response.Status status; private final Class type; diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ErrorDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ErrorDto.java index f0df654866..bd889d5de5 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ErrorDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ErrorDto.java @@ -17,7 +17,7 @@ public class ErrorDto { private List context; private String message; - @XmlElement(name = "violation") + @JsonInclude(JsonInclude.Include.NON_NULL) @XmlElementWrapper(name = "violations") private List violations;