You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2018/09/06 08:24:43 UTC
[incubator-servicecomb-java-chassis] 01/03: [SCB-873] Make the
validation result display the parameter name instead of arg0, arg1
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 <we...@huawei.com>
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());
+
+ }
+}