From 5c0920757e1a2f1a5b6702efd59d3ad1251683fb Mon Sep 17 00:00:00 2001 From: Dennis Kieselhorst Date: Mon, 23 Jan 2017 14:23:44 +0100 Subject: [PATCH] CXF-7222: Improve extensibility of JAX-RS ExceptionMappers --- .../impl/WebApplicationExceptionMapper.java | 10 +++++++- .../validation/ValidationExceptionMapper.java | 25 ++++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/WebApplicationExceptionMapper.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/WebApplicationExceptionMapper.java index bbc0bfca045..fa19168af5c 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/WebApplicationExceptionMapper.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/WebApplicationExceptionMapper.java @@ -74,7 +74,7 @@ public Response toResponse(WebApplicationException ex) { if (doAddMessage) { r = JAXRSUtils.copyResponseIfNeeded(r); - r = JAXRSUtils.fromResponse(r).entity(errorMessage).type(MediaType.TEXT_PLAIN).build(); + r = buildResponse(r, errorMessage); } return r; } @@ -93,6 +93,14 @@ protected String buildErrorMessage(Response r, WebApplicationException ex) { } return sb.toString(); } + + protected Response buildResponse(Response response, String responseText) { + Response.ResponseBuilder rb = JAXRSUtils.fromResponse(response); + if (responseText != null) { + rb.type(MediaType.TEXT_PLAIN).entity(responseText); + } + return rb.build(); + } /** * Control whether to log at WARN or FINE level. diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java index 146d1051593..7f5e5dcb955 100644 --- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java +++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java @@ -24,6 +24,7 @@ import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import javax.validation.ValidationException; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.ext.ExceptionMapper; @@ -34,7 +35,7 @@ import org.apache.cxf.validation.ResponseConstraintViolationException; @Provider -public class ValidationExceptionMapper implements ExceptionMapper< ValidationException > { +public class ValidationExceptionMapper implements ExceptionMapper { private static final Logger LOG = LogUtils.getL7dLogger(ValidationExceptionMapper.class); private boolean addMessageToResponse; @@ -48,7 +49,7 @@ public Response toResponse(ValidationException exception) { final ConstraintViolationException constraint = (ConstraintViolationException) exception; for (final ConstraintViolation< ? > violation: constraint.getConstraintViolations()) { - String message = getMessage(violation); + String message = buildErrorMessage(violation); if (responseBody != null) { responseBody.append(message).append("\n"); } @@ -58,22 +59,28 @@ public Response toResponse(ValidationException exception) { if (!(constraint instanceof ResponseConstraintViolationException)) { errorStatus = Response.Status.BAD_REQUEST; } - ResponseBuilder rb = JAXRSUtils.toResponseBuilder(errorStatus); - if (responseBody != null) { - rb.entity(responseBody.toString()); - } - return rb.build(); + return buildResponse(errorStatus, responseBody != null ? responseBody.toString() : null); } else { - return JAXRSUtils.toResponse(errorStatus); + return buildResponse(errorStatus, addMessageToResponse ? exception.getMessage() : null); } } - private String getMessage(ConstraintViolation violation) { + + protected String buildErrorMessage(ConstraintViolation violation) { return "Value " + (violation.getInvalidValue() != null ? "'" + violation.getInvalidValue().toString() + "'" : "(null)") + " of " + violation.getRootBeanClass().getSimpleName() + "." + violation.getPropertyPath() + ": " + violation.getMessage(); } + + protected Response buildResponse(Response.Status errorStatus, String responseText) { + ResponseBuilder rb = JAXRSUtils.toResponseBuilder(errorStatus); + if (responseText != null) { + rb.type(MediaType.TEXT_PLAIN).entity(responseText); + } + return rb.build(); + } + /** * Controls whether to add a constraint validation message to Response or not * @param addMessageToResponse add a constraint validation message to Response