This is an automated email from the ASF dual-hosted git repository.

wujimin pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-servicecomb-java-chassis.git

commit 912f8c07a35355fdd388fa32bc77b0ad34327abf
Author: weichao666 <[email protected]>
AuthorDate: Tue Aug 28 14:19:33 2018 +0800

    [SCB-873] Make the validation result display the parameter name instead of 
arg0, arg1
---
 .../servicecomb/demo/jaxrs/client/JaxrsClient.java |  12 +--
 .../client/validation/ValidationServiceClient.java |   6 +-
 .../swagger/generator/core/utils/ParamUtils.java   |  13 ++-
 .../validator/DefaultParameterNameProviderEx.java  |  40 ++++++++
 .../invocation/validator/ParameterValidator.java   |   6 +-
 .../TestDefaultParameterNameProviderEx.java        | 103 +++++++++++++++++++++
 6 files changed, 165 insertions(+), 15 deletions(-)

diff --git 
a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java
 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java
index f28ffbd..7834980 100644
--- 
a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java
+++ 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/JaxrsClient.java
@@ -304,9 +304,7 @@ public class JaxrsClient {
       // ignored
       Map data = (Map) e.getErrorData();
       TestMgr.check(
-          "[ConstraintViolationImpl{interpolatedMessage=",
-          data.get("message").toString().substring(0,
-              "[ConstraintViolationImpl{interpolatedMessage=".length()));
+          true, data.get("message").toString().contains("propertyPath=add.b"));
     }
 
     TestMgr.check(true, isExcep);
@@ -332,9 +330,7 @@ public class JaxrsClient {
       // Message dependends on locale, so just check the short part.
       Map data = (Map) e.getErrorData();
       TestMgr.check(
-          "[ConstraintViolationImpl{interpolatedMessage=",
-          data.get("message").toString().substring(0,
-              "[ConstraintViolationImpl{interpolatedMessage=".length()));
+          true, 
data.get("message").toString().contains("propertyPath=sayHi.name"));
     }
     TestMgr.check(true, isExcep);
   }
@@ -367,9 +363,7 @@ public class JaxrsClient {
       // Message dependends on locale, so just check the short part.
       Map data = (Map) e.getErrorData();
       TestMgr.check(
-          "[ConstraintViolationImpl{interpolatedMessage",
-          data.get("message").toString().substring(0,
-              "[ConstraintViolationImpl{interpolatedMessage".length()));
+          true, 
data.get("message").toString().contains("propertyPath=sayHello.student.age"));
     }
     TestMgr.check(true, isExcep);
   }
diff --git 
a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/validation/ValidationServiceClient.java
 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/validation/ValidationServiceClient.java
index 727a050..9168d78 100644
--- 
a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/validation/ValidationServiceClient.java
+++ 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/validation/ValidationServiceClient.java
@@ -52,7 +52,7 @@ public class ValidationServiceClient {
       template.postForObject(urlPrefix + "/validate", model, 
ValidationModel.class);
       TestMgr.check(false, true);
     } catch (InvocationException e) {
-      TestMgr.check(e.getErrorData().toString().contains("age"), true);
+      
TestMgr.check(e.getErrorData().toString().contains("propertyPath=errorCode.request.age"),
 true);
     }
 
     try {
@@ -61,7 +61,7 @@ public class ValidationServiceClient {
       template.postForObject(urlPrefix + "/validate", model, 
ValidationModel.class);
       TestMgr.check(false, true);
     } catch (InvocationException e) {
-      TestMgr.check(e.getErrorData().toString().contains("member"), true);
+      
TestMgr.check(e.getErrorData().toString().contains("propertyPath=errorCode.request.members"),
 true);
     }
 
     String strResult = template.getForObject(urlPrefix + 
"/validateQuery?name=", String.class);
@@ -71,7 +71,7 @@ public class ValidationServiceClient {
       template.getForObject(urlPrefix + "/validateQuery", String.class);
       TestMgr.check(false, true);
     } catch (InvocationException e) {
-      TestMgr.check(e.getErrorData().toString().contains("null"), true);
+      
TestMgr.check(e.getErrorData().toString().contains("propertyPath=queryValidate.name"),
 true);
     }
   }
 }
diff --git 
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ParamUtils.java
 
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ParamUtils.java
index 924bc65..2cd5e30 100644
--- 
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ParamUtils.java
+++ 
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/utils/ParamUtils.java
@@ -17,6 +17,7 @@
 
 package org.apache.servicecomb.swagger.generator.core.utils;
 
+import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
 import java.util.List;
@@ -56,8 +57,17 @@ public final class ParamUtils {
     return existName;
   }
 
+  public static String getParameterName(Constructor<?> constructor, int 
paramIdx) {
+    MethodParameter methodParameter = new MethodParameter(constructor, 
paramIdx);
+    return getParameterName(methodParameter, paramIdx);
+  }
+
   public static String getParameterName(Method method, int paramIdx) {
     MethodParameter methodParameter = new MethodParameter(method, paramIdx);
+    return getParameterName(methodParameter, paramIdx);
+  }
+
+  public static String getParameterName(MethodParameter methodParameter, int 
paramIdx) {
     methodParameter.initParameterNameDiscovery(parameterNameDiscoverer);
 
     String paramName = methodParameter.getParameterName();
@@ -140,8 +150,7 @@ public final class ParamUtils {
           String.format(
               "not allow such type of param:[%s], param name is [%s]",
               property.getClass(),
-              parameter.getName())
-      );
+              parameter.getName()));
     }
     parameter.setProperty(property);
   }
diff --git 
a/swagger/swagger-invocation/invocation-validator/src/main/java/org/apache/servicecomb/swagger/invocation/validator/DefaultParameterNameProviderEx.java
 
b/swagger/swagger-invocation/invocation-validator/src/main/java/org/apache/servicecomb/swagger/invocation/validator/DefaultParameterNameProviderEx.java
new file mode 100644
index 0000000..7d92169
--- /dev/null
+++ 
b/swagger/swagger-invocation/invocation-validator/src/main/java/org/apache/servicecomb/swagger/invocation/validator/DefaultParameterNameProviderEx.java
@@ -0,0 +1,40 @@
+package org.apache.servicecomb.swagger.invocation.validator;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.validation.ParameterNameProvider;
+
+import org.apache.servicecomb.swagger.generator.core.utils.ParamUtils;
+
+
+public class DefaultParameterNameProviderEx implements ParameterNameProvider {
+
+  @Override
+  public List<String> getParameterNames(Constructor<?> constructor) {
+    Parameter[] parameters = constructor.getParameters();
+    List<String> parameterNames = new ArrayList<>(parameters.length);
+
+    for (int i = 0; i < parameters.length; i++) {
+      parameterNames.add(ParamUtils.getParameterName(constructor, i));
+    }
+
+    return Collections.unmodifiableList(parameterNames);
+  }
+
+  @Override
+  public List<String> getParameterNames(Method method) {
+    Parameter[] parameters = method.getParameters();
+    List<String> parameterNames = new ArrayList<>(parameters.length);
+
+    for (int i = 0; i < parameters.length; i++) {
+      parameterNames.add(ParamUtils.getParameterName(method, i));
+    }
+
+    return Collections.unmodifiableList(parameterNames);
+  }
+}
diff --git 
a/swagger/swagger-invocation/invocation-validator/src/main/java/org/apache/servicecomb/swagger/invocation/validator/ParameterValidator.java
 
b/swagger/swagger-invocation/invocation-validator/src/main/java/org/apache/servicecomb/swagger/invocation/validator/ParameterValidator.java
index fcb3897..e5bf3f0 100644
--- 
a/swagger/swagger-invocation/invocation-validator/src/main/java/org/apache/servicecomb/swagger/invocation/validator/ParameterValidator.java
+++ 
b/swagger/swagger-invocation/invocation-validator/src/main/java/org/apache/servicecomb/swagger/invocation/validator/ParameterValidator.java
@@ -43,7 +43,11 @@ public class ParameterValidator implements 
ProducerInvokeExtension {
       throws ConstraintViolationException {
 
     if (null == executableValidator) {
-      ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
+      ValidatorFactory factory =
+          Validation.byDefaultProvider()
+              .configure()
+              .parameterNameProvider(new DefaultParameterNameProviderEx())
+              .buildValidatorFactory();
       executableValidator = factory.getValidator().forExecutables();
     }
     Set<ConstraintViolation<Object>> violations =
diff --git 
a/swagger/swagger-invocation/invocation-validator/src/test/java/org/apache/servicecomb/swagger/invocation/validator/TestDefaultParameterNameProviderEx.java
 
b/swagger/swagger-invocation/invocation-validator/src/test/java/org/apache/servicecomb/swagger/invocation/validator/TestDefaultParameterNameProviderEx.java
new file mode 100644
index 0000000..360b60e
--- /dev/null
+++ 
b/swagger/swagger-invocation/invocation-validator/src/test/java/org/apache/servicecomb/swagger/invocation/validator/TestDefaultParameterNameProviderEx.java
@@ -0,0 +1,103 @@
+package org.apache.servicecomb.swagger.invocation.validator;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.hamcrest.Matchers;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class TestDefaultParameterNameProviderEx {
+  static class ValidatorForTest {
+    static class Student {
+      private String name;
+
+      int age;
+
+      public String getName() {
+        return name;
+      }
+
+      public void setName(String name) {
+        this.name = name;
+      }
+
+      public int getAge() {
+        return age;
+      }
+
+      public void setAge(int age) {
+        this.age = age;
+      }
+    }
+
+    private String grade;
+
+    private int number;
+
+    public ValidatorForTest() {
+    }
+
+    public ValidatorForTest(String grade, int number) {
+      this.grade = grade;
+      this.number = number;
+    }
+
+    public int add(int a, int b) {
+      return a + b;
+    }
+
+    public String sayHi(String hi) {
+      return hi + " sayhi";
+    }
+
+    public Student sayHello(Student student) {
+      return student;
+    }
+
+    public String setTest(String grade) {
+      this.grade = grade;
+      return this.grade;
+    }
+
+    public int getNumber() {
+      return number;
+    }
+
+    public void setNumber(int number) {
+      this.number = number;
+    }
+  }
+
+  Class<ValidatorForTest> validatorForTest = ValidatorForTest.class;
+
+  DefaultParameterNameProviderEx parameterNameProviderEx = new 
DefaultParameterNameProviderEx();
+
+  @Test
+  public void testMethod() throws NoSuchMethodException {
+    Method method = validatorForTest.getMethod("add", int.class, int.class);
+    Assert.assertThat(parameterNameProviderEx.getParameterNames(method), 
Matchers.contains("a", "b"));
+    method = validatorForTest.getMethod("sayHi", String.class);
+    Assert.assertThat(parameterNameProviderEx.getParameterNames(method), 
Matchers.contains("hi"));
+    method = validatorForTest.getMethod("sayHello", 
ValidatorForTest.Student.class);
+    Assert.assertThat(parameterNameProviderEx.getParameterNames(method), 
Matchers.contains("student"));
+    method = validatorForTest.getMethod("setTest", String.class);
+    Assert.assertThat(parameterNameProviderEx.getParameterNames(method), 
Matchers.contains("grade"));
+    method = validatorForTest.getMethod("getNumber");
+    
Assert.assertTrue(parameterNameProviderEx.getParameterNames(method).isEmpty());
+    method = validatorForTest.getMethod("setNumber", int.class);
+    Assert.assertThat(parameterNameProviderEx.getParameterNames(method), 
Matchers.contains("number"));
+  }
+
+  @Test
+  public void testConstructor() throws NoSuchMethodException {
+    Constructor<ValidatorForTest> constructor = 
validatorForTest.getConstructor(String.class, int.class);
+    Assert.assertThat(parameterNameProviderEx.getParameterNames(constructor), 
Matchers.contains("grade", "number"));
+    constructor = validatorForTest.getConstructor();
+    
Assert.assertTrue(parameterNameProviderEx.getParameterNames(constructor).isEmpty());
+
+  }
+}

Reply via email to