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()); + + } +}
