From a802bcb34254382d94b392b27550e1565c62582e Mon Sep 17 00:00:00 2001 From: slavb18 Date: Thu, 15 Sep 2016 15:25:48 +0400 Subject: [PATCH 1/4] include details of validation exceptions in response --- .../validation/ValidationExceptionMapper.java | 50 +++++++++++++++++-- 1 file changed, 45 insertions(+), 5 deletions(-) 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 b15ad0be817..f03c2756b51 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 @@ -31,29 +31,69 @@ import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.jaxrs.utils.JAXRSUtils; import org.apache.cxf.validation.ResponseConstraintViolationException; +import org.springframework.expression.Expression; +import org.springframework.expression.ExpressionParser; +import org.springframework.expression.spel.standard.SpelExpressionParser; @Provider public class ValidationExceptionMapper implements ExceptionMapper< ValidationException > { private static final Logger LOG = LogUtils.getL7dLogger(ValidationExceptionMapper.class); + private boolean addMessageToResponse; + + private Expression messageExpression; + @Override public Response toResponse(ValidationException exception) { Response.Status errorStatus = Response.Status.INTERNAL_SERVER_ERROR; + StringBuilder responseBody= new StringBuilder(512); if (exception instanceof ConstraintViolationException) { final ConstraintViolationException constraint = (ConstraintViolationException) exception; for (final ConstraintViolation< ? > violation: constraint.getConstraintViolations()) { - LOG.log(Level.WARNING, - violation.getRootBeanClass().getSimpleName() - + "." + violation.getPropertyPath() - + ": " + violation.getMessage()); + String message=getMessage(violation); + + LOG.log(Level.WARNING, message); + if(addMessageToResponse){ + responseBody.append(message).append("\n"); + } } if (!(constraint instanceof ResponseConstraintViolationException)) { errorStatus = Response.Status.BAD_REQUEST; } } - return JAXRSUtils.toResponse(errorStatus); + Response.ResponseBuilder rb=JAXRSUtils.toResponseBuilder(errorStatus); + if(addMessageToResponse){ + rb.entity(responseBody.toString()); + } + return rb.build(); + } + String getMessage(ConstraintViolation< ?> violation) { + String message; + if (messageExpression == null) { + message = violation.getRootBeanClass().getSimpleName() + + "." + violation.getPropertyPath() + + ": " + violation.getMessage(); + } else { + message = messageExpression.getValue(violation, String.class); + } + return message; + } + /** + * Controls whether to add an constraint validation message to Response or not, + * @param addMessageToResponse add a constraint validation message to Respons + */ + public void setAddMessageToResponse(boolean addMessageToResponse) { + this.addMessageToResponse = addMessageToResponse; + } + + public void setMessageTemplate(String messageTemplate) { + ExpressionParser parser = new SpelExpressionParser(); + this.messageExpression = parser.parseExpression(messageTemplate); + } + + } From 2626702906e1bd761c0c6d92b985a90d12f8a2f7 Mon Sep 17 00:00:00 2001 From: slavb18 Date: Thu, 15 Sep 2016 15:29:39 +0400 Subject: [PATCH 2/4] add javadoc on setMessageTemplate method --- .../cxf/jaxrs/validation/ValidationExceptionMapper.java | 6 ++++++ 1 file changed, 6 insertions(+) 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 f03c2756b51..e7f2ce9ce61 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 @@ -90,6 +90,12 @@ public void setAddMessageToResponse(boolean addMessageToResponse) { this.addMessageToResponse = addMessageToResponse; } + /** + * Sets message template in SpEL expression. Expression will be evaluated in + * ConstraintViolation context. + * Example: rootBeanClass.simpleName + '.' + propertyPath + ': ' + message + * @param messageTemplate + */ public void setMessageTemplate(String messageTemplate) { ExpressionParser parser = new SpelExpressionParser(); this.messageExpression = parser.parseExpression(messageTemplate); From cd3289ded9142bb33b8b4ab0ee6de45dde647def Mon Sep 17 00:00:00 2001 From: slavb18 Date: Thu, 15 Sep 2016 15:47:05 +0400 Subject: [PATCH 3/4] remove SpEl dependency --- .../validation/ValidationExceptionMapper.java | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) 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 e7f2ce9ce61..9e02df22568 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 @@ -31,9 +31,6 @@ import org.apache.cxf.common.logging.LogUtils; import org.apache.cxf.jaxrs.utils.JAXRSUtils; import org.apache.cxf.validation.ResponseConstraintViolationException; -import org.springframework.expression.Expression; -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.spel.standard.SpelExpressionParser; @Provider public class ValidationExceptionMapper implements ExceptionMapper< ValidationException > { @@ -41,8 +38,6 @@ public class ValidationExceptionMapper implements ExceptionMapper< ValidationExc private boolean addMessageToResponse; - private Expression messageExpression; - @Override public Response toResponse(ValidationException exception) { Response.Status errorStatus = Response.Status.INTERNAL_SERVER_ERROR; @@ -71,14 +66,9 @@ public Response toResponse(ValidationException exception) { return rb.build(); } String getMessage(ConstraintViolation< ?> violation) { - String message; - if (messageExpression == null) { - message = violation.getRootBeanClass().getSimpleName() + String message = violation.getRootBeanClass().getSimpleName() + "." + violation.getPropertyPath() + ": " + violation.getMessage(); - } else { - message = messageExpression.getValue(violation, String.class); - } return message; } @@ -89,17 +79,5 @@ String getMessage(ConstraintViolation< ?> violation) { public void setAddMessageToResponse(boolean addMessageToResponse) { this.addMessageToResponse = addMessageToResponse; } - - /** - * Sets message template in SpEL expression. Expression will be evaluated in - * ConstraintViolation context. - * Example: rootBeanClass.simpleName + '.' + propertyPath + ': ' + message - * @param messageTemplate - */ - public void setMessageTemplate(String messageTemplate) { - ExpressionParser parser = new SpelExpressionParser(); - this.messageExpression = parser.parseExpression(messageTemplate); - } - } From 3549ab8f93bfc284185f29f76102bdde8abd92f3 Mon Sep 17 00:00:00 2001 From: slavb18 Date: Thu, 15 Sep 2016 17:09:03 +0400 Subject: [PATCH 4/4] fix validation errors and add property value to message --- .../validation/ValidationExceptionMapper.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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 9e02df22568..e1ccbfd8c08 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 @@ -41,16 +41,16 @@ public class ValidationExceptionMapper implements ExceptionMapper< ValidationExc @Override public Response toResponse(ValidationException exception) { Response.Status errorStatus = Response.Status.INTERNAL_SERVER_ERROR; - StringBuilder responseBody= new StringBuilder(512); + StringBuilder responseBody = new StringBuilder(512); if (exception instanceof ConstraintViolationException) { final ConstraintViolationException constraint = (ConstraintViolationException) exception; for (final ConstraintViolation< ? > violation: constraint.getConstraintViolations()) { - String message=getMessage(violation); + String message = getMessage(violation); LOG.log(Level.WARNING, message); - if(addMessageToResponse){ + if (addMessageToResponse) { responseBody.append(message).append("\n"); } } @@ -60,17 +60,17 @@ public Response toResponse(ValidationException exception) { } } Response.ResponseBuilder rb=JAXRSUtils.toResponseBuilder(errorStatus); - if(addMessageToResponse){ + if (addMessageToResponse) { rb.entity(responseBody.toString()); } return rb.build(); } String getMessage(ConstraintViolation< ?> violation) { - String message = violation.getRootBeanClass().getSimpleName() - + "." + violation.getPropertyPath() - + ": " + violation.getMessage(); + String message = "Value '" + violation.getInvalidValue().toString() + + "' of " + violation.getRootBeanClass().getSimpleName() + + "." + violation.getPropertyPath() + + ": " + violation.getMessage(); return message; - } /** * Controls whether to add an constraint validation message to Response or not,