You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2013/11/08 18:01:40 UTC

svn commit: r1540118 - in /cxf/trunk: rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/

Author: sergeyb
Date: Fri Nov  8 17:01:40 2013
New Revision: 1540118

URL: http://svn.apache.org/r1540118
Log:
[CXF-5309] Optionally reporting more parameter info during the exception processing

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/BookStoreWithValidation.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/BookWithValidation.java
    cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSClientServerValidationTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java?rev=1540118&r1=1540117&r2=1540118&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/validation/ValidationExceptionMapper.java Fri Nov  8 17:01:40 2013
@@ -23,31 +23,38 @@ import java.util.logging.Logger;
 
 import javax.validation.ConstraintViolation;
 import javax.validation.ConstraintViolationException;
+import javax.validation.Path;
 import javax.validation.ValidationException;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.ext.ExceptionMapper;
 import javax.ws.rs.ext.Provider;
 
 import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.jaxrs.model.OperationResourceInfo;
+import org.apache.cxf.jaxrs.model.Parameter;
+import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 import org.apache.cxf.validation.ResponseConstraintViolationException;
 
 @Provider
 public class ValidationExceptionMapper implements ExceptionMapper< ValidationException > {
     private static final Logger LOG = LogUtils.getL7dLogger(ValidationExceptionMapper.class);
+    private boolean reportParameterInfo;
     
     @Override
     public Response toResponse(ValidationException exception) {
         if (exception instanceof ConstraintViolationException) { 
-            final ConstraintViolationException constraint = (ConstraintViolationException) exception;
             
+            final ConstraintViolationException constraint = (ConstraintViolationException) exception;
+            final boolean isResponseException = constraint instanceof ResponseConstraintViolationException;
+                        
             for (final ConstraintViolation< ? > violation: constraint.getConstraintViolations()) {
                 LOG.log(Level.SEVERE, 
                     violation.getRootBeanClass().getSimpleName() 
-                    + "." + violation.getPropertyPath() 
+                    + "." + getPropertyPathDescription(violation.getPropertyPath(), isResponseException) 
                     + ": " + violation.getMessage());
             }
             
-            if (constraint instanceof ResponseConstraintViolationException) {
+            if (isResponseException) {
                 return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
             }
             
@@ -55,5 +62,63 @@ public class ValidationExceptionMapper i
         } else {
             return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
         }
+        
+        
+    }
+    
+    protected String getPropertyPathDescription(Path propertyPath, boolean isResponseException) {
+        final String path = propertyPath.toString();
+        if (isResponseException || !isReportParameterInfo()) {
+            return path;
+        }
+        int index = path.lastIndexOf(".arg");
+        if (index == -1 || index + 4 >= path.length()) {
+            return path;
+        }
+        
+        boolean compositePath = false;
+        
+        int argPos;
+        try { 
+            String argPath = path.substring(index + 4);
+            int infoIndex = argPath.indexOf('[');
+            if (infoIndex == -1) {
+                infoIndex = argPath.indexOf('.');
+            }
+            if (infoIndex > 0) {
+                argPath = argPath.substring(0, infoIndex);
+                compositePath = true;
+            }
+            argPos = Integer.valueOf(argPath);
+        } catch (NumberFormatException ex) {
+            return path;
+        }
+        final OperationResourceInfo ori = JAXRSUtils.getCurrentMessage().getExchange().get(OperationResourceInfo.class);
+        if (argPos < 0 || argPos > ori.getParameters().size()) {
+            return path;
+        }
+        Parameter param = ori.getParameters().get(argPos);
+        
+        StringBuilder sb = new StringBuilder();
+        sb.append("(");
+        if (compositePath) {
+            sb.append("arg" + argPos + " ");
+        }
+        sb.append("JAXRS param is " + param.getType().toString());
+        if (param.getName() != null) {
+            sb.append("(\"" + param.getName() + "\")");
+        }
+        sb.append(", class: " + ori.getAnnotatedMethod().getParameterTypes()[argPos].getSimpleName());
+        sb.append(")");
+        return path + sb.toString();
+            
+    }
+
+    public boolean isReportParameterInfo() {
+        return reportParameterInfo;
+    }
+
+    public void setReportParameterInfo(boolean reportParameterInfo) {
+        this.reportParameterInfo = reportParameterInfo;
     }
 }

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/BookStoreWithValidation.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/BookStoreWithValidation.java?rev=1540118&r1=1540117&r2=1540118&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/BookStoreWithValidation.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/BookStoreWithValidation.java Fri Nov  8 17:01:40 2013
@@ -20,11 +20,13 @@ package org.apache.cxf.systest.jaxrs.val
 
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
+import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.DefaultValue;
 import javax.ws.rs.FormParam;
@@ -67,6 +69,22 @@ public class BookStoreWithValidation ext
         return Response.created(uriInfo.getRequestUriBuilder().path(id).build()).build();
     }
     
+    @POST
+    @Path("/books/direct")
+    @Consumes("text/xml")
+    public Response addBookDirect(@Valid BookWithValidation book, @Context final UriInfo uriInfo) {
+        books.put(book.getId(), book);   
+        return Response.created(uriInfo.getRequestUriBuilder().path(book.getId()).build()).build();
+    }
+    
+    @POST
+    @Path("/books/directmany")
+    @Consumes("text/xml")
+    public Response addBooksDirect(@Valid List<BookWithValidation> list, @Context final UriInfo uriInfo) {
+        books.put(list.get(0).getId(), list.get(0));   
+        return Response.created(uriInfo.getRequestUriBuilder().path(list.get(0).getId()).build()).build();
+    }
+    
     @GET
     @Path("/books")
     @Override

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/BookWithValidation.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/BookWithValidation.java?rev=1540118&r1=1540117&r2=1540118&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/BookWithValidation.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/BookWithValidation.java Fri Nov  8 17:01:40 2013
@@ -21,11 +21,6 @@ package org.apache.cxf.systest.jaxrs.val
 import javax.validation.constraints.NotNull;
 import javax.xml.bind.annotation.XmlRootElement;
 
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.fasterxml.jackson.annotation.JsonTypeInfo.As;
-import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
-
-@JsonTypeInfo(use = Id.CLASS, include = As.PROPERTY, property = "class")
 @XmlRootElement(name = "BookWithValidation")
 public class BookWithValidation {
     @NotNull private String name;

Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSClientServerValidationTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSClientServerValidationTest.java?rev=1540118&r1=1540117&r2=1540118&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSClientServerValidationTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/validation/JAXRSClientServerValidationTest.java Fri Nov  8 17:01:40 2013
@@ -19,6 +19,7 @@
 package org.apache.cxf.systest.jaxrs.validation;
 
 import java.util.Arrays;
+import java.util.Collections;
 
 import javax.ws.rs.core.Form;
 import javax.ws.rs.core.MediaType;
@@ -132,6 +133,27 @@ public class JAXRSClientServerValidation
     }
     
     @Test
+    public void testThatNoValidationConstraintsAreViolatedWithBook()  {
+        final Response r = createWebClient("/bookstore/books/direct").type("text/xml").post(
+              new BookWithValidation("BeanVal", "1"));
+        assertEquals(Status.CREATED.getStatusCode(), r.getStatus());
+    }
+    
+    @Test
+    public void testThatValidationConstraintsAreViolatedWithBook()  {
+        final Response r = createWebClient("/bookstore/books/direct").type("text/xml").post(
+              new BookWithValidation("BeanVal"));
+        assertEquals(Status.BAD_REQUEST.getStatusCode(), r.getStatus());
+    }
+    
+    @Test
+    public void testThatValidationConstraintsAreViolatedWithBooks()  {
+        final Response r = createWebClient("/bookstore/books/directmany").type("text/xml").postCollection(
+              Collections.singletonList(new BookWithValidation("BeanVal")), BookWithValidation.class);
+        assertEquals(Status.BAD_REQUEST.getStatusCode(), r.getStatus());
+    }
+    
+    @Test
     public void testThatResponseValidationForOneBookFails()  {
         Response r = createWebClient("/bookstore/books").post(new Form().param("id", "1234"));
         assertEquals(Status.CREATED.getStatusCode(), r.getStatus());