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

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

commit 9eea3827b3b4fd333766fee813bc0e77764501f7
Author: acsukesh <[email protected]>
AuthorDate: Tue Jul 3 21:12:04 2018 +0530

    [SCB-713] @DefaulValue should be set only when input param is null
---
 .../rest/codec/param/CookieProcessorCreator.java   |   2 +-
 .../rest/codec/param/FormProcessorCreator.java     |   4 +-
 .../rest/codec/param/HeaderProcessorCreator.java   |   2 +-
 .../rest/codec/param/QueryProcessorCreator.java    |   2 +-
 .../servicecomb/demo/jaxrs/client/JaxrsClient.java |  96 ++++++++++++++--
 .../demo/jaxrs/server/DefaultValues.java           |  48 --------
 .../demo/jaxrs/server/JaxRSDefaultValues.java      |  75 ++++++++++++
 .../demo/springmvc/client/SpringmvcClient.java     | 127 +++++++++++++--------
 demo/demo-springmvc/springmvc-server/pom.xml       |   5 +-
 .../springmvc/server/SpringMvcDefaultValues.java   |  51 +++++++++
 .../swagger/generator/core/OperationGenerator.java |  16 +--
 .../parameter/AbstractParameterProcessor.java      |  11 +-
 12 files changed, 314 insertions(+), 125 deletions(-)

diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/CookieProcessorCreator.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/CookieProcessorCreator.java
index 47768c7..3ad7903 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/CookieProcessorCreator.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/CookieProcessorCreator.java
@@ -50,7 +50,7 @@ public class CookieProcessorCreator implements 
ParamValueProcessorCreator {
       for (Cookie cookie : cookies) {
         if (paramPath.equals(cookie.getName())) {
           value = cookie.getValue();
-          if (value == null || value.equals("")) {
+          if (value == null) {
             Object defaultValue = getDefaultValue();
             if (defaultValue != null) {
               value = defaultValue.toString();
diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/FormProcessorCreator.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/FormProcessorCreator.java
index 3605af5..81cf912 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/FormProcessorCreator.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/FormProcessorCreator.java
@@ -45,7 +45,7 @@ public class FormProcessorCreator implements 
ParamValueProcessorCreator {
     public Object getValue(HttpServletRequest request) {
       @SuppressWarnings("unchecked")
       Map<String, Object> forms = (Map<String, Object>) 
request.getAttribute(RestConst.FORM_PARAMETERS);
-      if (forms != null) {
+      if (forms != null && !forms.isEmpty()) {
         return convertValue(forms.get(paramPath), targetType);
       }
 
@@ -54,7 +54,7 @@ public class FormProcessorCreator implements 
ParamValueProcessorCreator {
       }
 
       Object value = request.getParameter(paramPath);
-      if (value == null || value.equals("")) {
+      if (value == null) {
         Object defaultValue = getDefaultValue();
         if (defaultValue != null) {
           value = defaultValue;
diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/HeaderProcessorCreator.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/HeaderProcessorCreator.java
index 16b6056..52ea2b2 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/HeaderProcessorCreator.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/HeaderProcessorCreator.java
@@ -56,7 +56,7 @@ public class HeaderProcessorCreator implements 
ParamValueProcessorCreator {
         value = Collections.list(headerValues);
       } else {
         value = request.getHeader(paramPath);
-        if (value == null || value.equals("")) {
+        if (value == null) {
           Object defaultValue = getDefaultValue();
           if (defaultValue != null) {
             value = defaultValue;
diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/QueryProcessorCreator.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/QueryProcessorCreator.java
index 908f512..231b6c9 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/QueryProcessorCreator.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/QueryProcessorCreator.java
@@ -44,7 +44,7 @@ public class QueryProcessorCreator implements 
ParamValueProcessorCreator {
         value = request.getParameterValues(paramPath);
       } else {
         value = request.getParameter(paramPath);
-        if (value == null || value.equals("")) {
+        if (value == null) {
           Object defaultValue = getDefaultValue();
           if (defaultValue != null) {
             value = defaultValue;
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 64b4df8..8d31fee 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
@@ -23,6 +23,7 @@ import java.util.Map;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response.Status;
 
+import org.apache.http.HttpStatus;
 import org.apache.servicecomb.common.rest.codec.RestObjectMapper;
 import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.CseContext;
@@ -34,11 +35,14 @@ import org.apache.servicecomb.demo.validator.Student;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.foundation.common.utils.Log4jUtils;
 import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder;
+import org.apache.servicecomb.swagger.invocation.exception.ExceptionFactory;
 import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.ResponseEntity;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
 public class JaxrsClient {
@@ -63,7 +67,7 @@ public class JaxrsClient {
     testCompute(templateNew);
     testValidator(templateNew);
     testClientTimeOut(templateNew);
-    testDefaultValues(templateNew);
+    testJaxRSDefaultValues(templateNew);
   }
 
   private static void testCompute(RestTemplate template) throws Exception {
@@ -100,24 +104,96 @@ public class JaxrsClient {
     }
   }
 
-  private static void testDefaultValues(RestTemplate template) throws 
Exception {
+
+  private static void testJaxRSDefaultValues(RestTemplate template) {
     String microserviceName = "jaxrs";
     for (String transport : DemoConst.transports) {
       
CseContext.getInstance().getConsumerProviderManager().setTransport(microserviceName,
 transport);
       TestMgr.setMsg(microserviceName, transport);
 
-      String cseUrlPrefix = "cse://" + microserviceName + "/default/";
-
-      TestMgr.check("40",
-          template.getForObject(cseUrlPrefix + "/add",
-              String.class));
+      String cseUrlPrefix = "cse://" + microserviceName + 
"/JaxRSDefaultValues/";
+
+      //default values
+      HttpHeaders headers = new HttpHeaders();
+      
headers.setContentType(org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED);
+      MultiValueMap<String, String> map = new LinkedMultiValueMap<String, 
String>();
+      HttpEntity<MultiValueMap<String, String>> request = new 
HttpEntity<MultiValueMap<String, String>>(map, headers);
+      String result = template.postForObject(cseUrlPrefix + "/form", request, 
String.class);
+      TestMgr.check("Hello 20bobo", result);
+
+      headers = new HttpHeaders();
+      HttpEntity<String> entity = new HttpEntity<>(null, headers);
+      result = template.postForObject(cseUrlPrefix + "/header", entity, 
String.class);
+      TestMgr.check("Hello 20bobo30", result);
+
+      result = template.getForObject(cseUrlPrefix + "/query?d=10", 
String.class);
+      TestMgr.check("Hello 20bobo4010", result);
+      boolean failed = false;
+      try {
+        result = template.getForObject(cseUrlPrefix + "/query2", String.class);
+      } catch (InvocationException e) {
+        failed = true;
+        TestMgr.check(e.getStatusCode(), 
ExceptionFactory.PRODUCER_INNER_STATUS_CODE);
+      }
 
-      TestMgr.check("hi test your age is : 20",
-          template.getForObject(cseUrlPrefix + "/sayhei",
-              String.class));
+      failed = false;
+      try {
+        result = template.getForObject(cseUrlPrefix + "/query2?d=2&e=2", 
String.class);
+      } catch (InvocationException e) {
+        failed = true;
+        TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST);
+      }
+      TestMgr.check(failed, true);
+
+      failed = false;
+      try {
+        result = template.getForObject(cseUrlPrefix + "/query2?a=&d=2&e=2", 
String.class);
+      } catch (InvocationException e) {
+        failed = true;
+        TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST);
+      }
+      TestMgr.check(failed, true);
 
+      result = template.getForObject(cseUrlPrefix + "/query2?d=30&e=2", 
String.class);
+      TestMgr.check("Hello 20bobo40302", result);
 
+      failed = false;
+      try {
+        result = template.getForObject(cseUrlPrefix + "/query3?a=2&b=2", 
String.class);
+      } catch (InvocationException e) {
+        failed = true;
+        TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST);
+      }
+      TestMgr.check(failed, true);
+
+      result = template.getForObject(cseUrlPrefix + "/query3?a=30&b=2", 
String.class);
+      TestMgr.check("Hello 302", result);
+
+      //input values
+      headers = new HttpHeaders();
+      
headers.setContentType(org.springframework.http.MediaType.APPLICATION_FORM_URLENCODED);
+      Map<String, String> params = new HashMap<String, String>();
+      params.put("a", "30");
+      params.put("b", "sam");
+      HttpEntity<Map<String, String>> requestPara = new HttpEntity<>(params, 
headers);
+      result = template.postForObject(cseUrlPrefix + "/form", requestPara, 
String.class);
+      TestMgr.check("Hello 30sam", result);
+
+      headers = new HttpHeaders();
+      headers.add("a", "30");
+      headers.add("b", "sam");
+      headers.add("c", "40");
+      entity = new HttpEntity<>(null, headers);
+      result = template.postForObject(cseUrlPrefix + "/header", entity, 
String.class);
+      TestMgr.check("Hello 30sam40", result);
+
+      result = template.getForObject(cseUrlPrefix + 
"/query?a=3&b=sam&c=5&d=30", String.class);
+      TestMgr.check("Hello 3sam530", result);
+
+      result = template.getForObject(cseUrlPrefix + 
"/query2?a=3&b=4&c=5&d=30&e=2", String.class);
+      TestMgr.check("Hello 345302", result);
     }
+
   }
 
 
diff --git 
a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/DefaultValues.java
 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/DefaultValues.java
deleted file mode 100644
index a3688ba..0000000
--- 
a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/DefaultValues.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.servicecomb.demo.jaxrs.server;
-
-import javax.validation.constraints.Min;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-
-import org.apache.servicecomb.provider.rest.common.RestSchema;
-
-@RestSchema(schemaId = "default")
-@Path("/default")
-@Produces(MediaType.APPLICATION_JSON)
-public class DefaultValues {
-
-  @Path("/add")
-  @GET
-  public int add(@DefaultValue("20") @FormParam("a") int a, 
@DefaultValue("20") @Min(20) @FormParam("b") int b) {
-    return a + b;
-  }
-
-  @Path("/sayhei")
-  @GET
-  public String sayHei(@DefaultValue("test") @QueryParam("name") String name,
-      @DefaultValue("20") @QueryParam("age") int age) {
-    return "hi " + name + " your age is : " + age;
-  }
-}
diff --git 
a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/JaxRSDefaultValues.java
 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/JaxRSDefaultValues.java
new file mode 100644
index 0000000..9a4159e
--- /dev/null
+++ 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/JaxRSDefaultValues.java
@@ -0,0 +1,75 @@
+package org.apache.servicecomb.demo.jaxrs.server;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DefaultValue;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+
+@RestSchema(schemaId = "JaxRSDefaultValues")
+@Path("/JaxRSDefaultValues")
+@Produces(MediaType.APPLICATION_JSON)
+public class JaxRSDefaultValues {
+
+  @Path("/form")
+  @POST
+  @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+  public String form(@DefaultValue("20") @FormParam("a") int a, 
@DefaultValue("bobo") @FormParam("b") String b) {
+    return "Hello " + a + b;
+  }
+
+  @Path("/header")
+  @POST
+  public String header(@DefaultValue("20") @HeaderParam("a") int a, 
@DefaultValue("bobo") @HeaderParam("b") String b,
+      @DefaultValue("30") @HeaderParam("c") Integer c) {
+    return "Hello " + a + b + c;
+  }
+
+  @Path("/query")
+  @GET
+  public String query(@DefaultValue("20") @QueryParam("a") int a, 
@DefaultValue("bobo") @QueryParam("b") String b,
+      @DefaultValue("40") @QueryParam("c") Integer c, @QueryParam("d") int d) {
+    return "Hello " + a + b + c + d;
+  }
+
+  @Path("/query2")
+  @GET
+  public String query2(@QueryParam("e") int e, @DefaultValue("20") 
@QueryParam("a") int a,
+      @DefaultValue("bobo") @QueryParam("b") String b,
+      @DefaultValue("40") @QueryParam("c") Integer c, @Min(value = 20) 
@Max(value = 30) @QueryParam("d") int d) {
+    return "Hello " + a + b + c + d + e;
+  }
+
+  @Path("/query3")
+  @GET
+  public String query3(@QueryParam("a") @Min(value = 20) int a, 
@QueryParam("b") String b) {
+    return "Hello " + a + b;
+  }
+
+  @Path("/packages")
+  @GET
+  public String queryPackages(HttpServletRequest httpRequest,
+      @Max(value = 2147483647L) @Min(value = -1L) @NotNull 
@QueryParam("pageNo") Integer pageNo,
+      @Max(value = 2147483647L) @Min(value = -1L) @NotNull 
@QueryParam("pageSize") Integer pageSize,
+      @Size(max = 64, min = 0) @QueryParam("packageName") String packageName,
+      @Max(value = 127L) @Min(value = 0L) @QueryParam("packageType") Integer 
packageType,
+      @Max(value = 2147483647L) @Min(value = 1L) @QueryParam("roleID") Integer 
roleID,
+      @Max(value = 2147483647L) @Min(value = 1L) @QueryParam("categoryID") 
Integer categoryID,
+      @Max(value = 127L) @Min(value = 0L) @QueryParam("appType") 
@DefaultValue("1") Integer appType,
+      @Max(value = 2L) @Min(value = 1L) @QueryParam("packageScope") Integer 
packageScope) {
+    return "" + appType;
+  }
+
+}
diff --git 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
index 50f4b92..c683862 100644
--- 
a/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
+++ 
b/demo/demo-springmvc/springmvc-client/src/main/java/org/apache/servicecomb/demo/springmvc/client/SpringmvcClient.java
@@ -20,6 +20,7 @@ package org.apache.servicecomb.demo.springmvc.client;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.http.HttpStatus;
 import org.apache.servicecomb.core.CseContext;
 import org.apache.servicecomb.demo.DemoConst;
 import org.apache.servicecomb.demo.TestMgr;
@@ -30,10 +31,15 @@ import 
org.apache.servicecomb.foundation.common.utils.Log4jUtils;
 import org.apache.servicecomb.provider.springmvc.reference.CseRestTemplate;
 import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder;
 import 
org.apache.servicecomb.provider.springmvc.reference.UrlWithServiceNameClientHttpRequestFactory;
+import org.apache.servicecomb.swagger.invocation.exception.ExceptionFactory;
+import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.springframework.http.HttpEntity;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
 import com.netflix.config.DynamicPropertyFactory;
@@ -84,8 +90,7 @@ public class SpringmvcClient {
 
       testController();
 
-      testDefaultValues(templateUrlWithServiceName, microserviceName);
-      testRequiredBody(templateUrlWithServiceName, microserviceName);
+      testSpringMvcDefaultValues(templateUrlWithServiceName, microserviceName);
     }
     HttpHeaders headers = new HttpHeaders();
     headers.set("Accept-Encoding", "gzip");
@@ -220,53 +225,83 @@ public class SpringmvcClient {
         "newer");
   }
 
-  private static void testDefaultValues(RestTemplate template, String 
microserviceName) {
-    String prefix = "cse://" + microserviceName;
-    TestMgr.check("hi test your age is : 20",
-        template.getForObject(prefix + "/annotations/sayhi",
-            String.class));
-
-    TestMgr.check("20",
-        template.getForObject(prefix + "/annotations/add",
-            String.class));
-
-    TestMgr.check("hei test",
-        template.getForObject(prefix + "/annotations/sayhei",
-            String.class));
-  }
-
-  private static void testRequiredBody(RestTemplate template, String 
microserviceName) {
-    String prefix = "cse://" + microserviceName;
-    Person user = new Person();
+  private static void testSpringMvcDefaultValues(RestTemplate template, String 
microserviceName) {
+    String cseUrlPrefix = "cse://" + microserviceName + 
"/SpringMvcDefaultValues/";
+    //default values
+    HttpHeaders headers = new HttpHeaders();
+    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+    MultiValueMap<String, String> map = new LinkedMultiValueMap<String, 
String>();
+    HttpEntity<MultiValueMap<String, String>> request = new 
HttpEntity<MultiValueMap<String, String>>(map, headers);
+    String result = template.postForObject(cseUrlPrefix + "/form", request, 
String.class);
+    TestMgr.check("Hello 20bobo", result);
+
+    headers = new HttpHeaders();
+    HttpEntity<String> entity = new HttpEntity<>(null, headers);
+    result = template.postForObject(cseUrlPrefix + "/header", entity, 
String.class);
+    TestMgr.check("Hello 20bobo30", result);
+
+    result = template.getForObject(cseUrlPrefix + "/query?d=10", String.class);
+    TestMgr.check("Hello 20bobo4010", result);
+    boolean failed = false;
+    try {
+      result = template.getForObject(cseUrlPrefix + "/query2", String.class);
+    } catch (InvocationException e) {
+      failed = true;
+      TestMgr.check(e.getStatusCode(), 
ExceptionFactory.PRODUCER_INNER_STATUS_CODE);
+    }
 
-    TestMgr.check("No user data found",
-        template.postForObject(prefix + 
"/annotations/saysomething?prefix={prefix}",
-            user,
-            String.class,
-            "ha"));
+    failed = false;
+    try {
+      result = template.getForObject(cseUrlPrefix + "/query2?d=2&e=2", 
String.class);
+    } catch (InvocationException e) {
+      failed = true;
+      TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST);
+    }
+    TestMgr.check(failed, true);
 
-    user.setName("world");
-    TestMgr.check("ha world",
-        template.postForObject(prefix + 
"/annotations/saysomething?prefix={prefix}",
-            user,
-            String.class,
-            "ha"));
+    failed = false;
+    try {
+      result = template.getForObject(cseUrlPrefix + "/query2?a=&d=2&e=2", 
String.class);
+    } catch (InvocationException e) {
+      failed = true;
+      TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST);
+    }
+    TestMgr.check(failed, true);
 
-    TestMgr.check("No user data found",
-        template.postForObject(prefix + 
"/annotations/saysomething?prefix={prefix}",
-            null,
-            String.class,
-            "ha"));
+    result = template.getForObject(cseUrlPrefix + "/query2?d=30&e=2", 
String.class);
+    TestMgr.check("Hello 20bobo40302", result);
 
-    TestMgr.check("No user name found",
-        template.postForObject(prefix + "/annotations/say",
-            "",
-            String.class,
-            "ha"));
-    TestMgr.check("test",
-        template.postForObject(prefix + "/annotations/say",
-            "test",
-            String.class,
-            "ha"));
+    failed = false;
+    try {
+      result = template.getForObject(cseUrlPrefix + "/query3?a=2&b=2", 
String.class);
+    } catch (InvocationException e) {
+      failed = true;
+      TestMgr.check(e.getStatusCode(), HttpStatus.SC_BAD_REQUEST);
+    }
+    TestMgr.check(failed, true);
+
+    result = template.getForObject(cseUrlPrefix + "/query3?a=30&b=2", 
String.class);
+    TestMgr.check("Hello 302", result);
+
+    //input values
+    headers = new HttpHeaders();
+    headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+    HttpEntity<Map<String, String>> requestPara = new HttpEntity<>(null, 
headers);
+    result = template.postForObject(cseUrlPrefix + "/form?a=30&b=sam", 
requestPara, String.class);
+    TestMgr.check("Hello 30sam", result);
+
+    headers = new HttpHeaders();
+    headers.add("a", "30");
+    headers.add("b", "sam");
+    headers.add("c", "40");
+    entity = new HttpEntity<>(null, headers);
+    result = template.postForObject(cseUrlPrefix + "/header", entity, 
String.class);
+    TestMgr.check("Hello 30sam40", result);
+
+    result = template.getForObject(cseUrlPrefix + "/query?a=3&b=sam&c=5&d=30", 
String.class);
+    TestMgr.check("Hello 3sam530", result);
+
+    result = template.getForObject(cseUrlPrefix + 
"/query2?a=3&b=4&c=5&d=30&e=2", String.class);
+    TestMgr.check("Hello 345302", result);
   }
 }
diff --git a/demo/demo-springmvc/springmvc-server/pom.xml 
b/demo/demo-springmvc/springmvc-server/pom.xml
index 57073c1..dd3f879 100644
--- a/demo/demo-springmvc/springmvc-server/pom.xml
+++ b/demo/demo-springmvc/springmvc-server/pom.xml
@@ -37,7 +37,10 @@
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>provider-springmvc</artifactId>
     </dependency>
-
+     <dependency>
+      <groupId>org.apache.servicecomb</groupId>
+      <artifactId>swagger-invocation-validator</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.apache.servicecomb</groupId>
       <artifactId>metrics-prometheus</artifactId>
diff --git 
a/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/SpringMvcDefaultValues.java
 
b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/SpringMvcDefaultValues.java
new file mode 100644
index 0000000..a67d8b2
--- /dev/null
+++ 
b/demo/demo-springmvc/springmvc-server/src/main/java/org/apache/servicecomb/demo/springmvc/server/SpringMvcDefaultValues.java
@@ -0,0 +1,51 @@
+package org.apache.servicecomb.demo.springmvc.server;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.ws.rs.core.MediaType;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@RestSchema(schemaId = "SpringMvcDefaultValues")
+@RequestMapping(path = "/springmvc/SpringMvcDefaultValues", produces = 
MediaType.APPLICATION_JSON)
+public class SpringMvcDefaultValues {
+
+  @PostMapping(path = "/form", consumes = 
MediaType.APPLICATION_FORM_URLENCODED)
+  public String form(@RequestParam(name = "a", defaultValue = "20") int a,
+      @RequestParam(name = "b", defaultValue = "bobo") String b) {
+    return "Hello " + a + b;
+  }
+
+  @PostMapping(path = "/header")
+  public String header(@RequestHeader(name = "a", defaultValue = "20") int a,
+      @RequestHeader(name = "b", defaultValue = "bobo") String b,
+      @RequestHeader(name = "c", defaultValue = "30") Integer c) {
+    return "Hello " + a + b + c;
+  }
+
+  @GetMapping("/query")
+  public String query(@RequestParam(name = "a", defaultValue = "20") int a,
+      @RequestParam(name = "b", defaultValue = "bobo") String b,
+      @RequestParam(name = "c", defaultValue = "40") Integer c, 
@RequestParam(name = "d") int d) {
+    return "Hello " + a + b + c + d;
+  }
+
+  @GetMapping("/query2")
+  public String query2(@RequestParam("e") int e, @RequestParam(name = "a", 
defaultValue = "20") int a,
+      @RequestParam(name = "b", defaultValue = "bobo") String b,
+      @RequestParam(name = "c", defaultValue = "40") Integer c,
+      @Min(value = 20) @Max(value = 30) @RequestParam("d") int d) {
+    return "Hello " + a + b + c + d + e;
+  }
+
+  @GetMapping("/query3")
+  public String query3(@RequestParam("a") @Min(value = 20) int a, 
@RequestParam("b") String b) {
+    return "Hello " + a + b;
+  }
+
+}
diff --git 
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java
 
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java
index 49fa2a1..40edc67 100644
--- 
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java
+++ 
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/OperationGenerator.java
@@ -39,6 +39,7 @@ import io.swagger.models.Operation;
 import io.swagger.models.Path;
 import io.swagger.models.Response;
 import io.swagger.models.Swagger;
+import io.swagger.models.parameters.AbstractSerializableParameter;
 import io.swagger.models.parameters.Parameter;
 import io.swagger.models.properties.Property;
 import io.swagger.util.ReflectionUtils;
@@ -74,8 +75,6 @@ public class OperationGenerator {
 
   protected String httpMethod;
 
-  protected String defaultValue;
-
   public OperationGenerator(SwaggerGenerator swaggerGenerator, Method 
providerMethod) {
     this.swaggerGenerator = swaggerGenerator;
     this.swagger = swaggerGenerator.swagger;
@@ -277,18 +276,25 @@ public class OperationGenerator {
   }
 
   protected void processByParameterAnnotation(Annotation[] paramAnnotations, 
int paramIdx) {
+    String defaultValue = null;
+    Parameter parameter = null;
     for (Annotation annotation : paramAnnotations) {
       //JAX-RS default value cannot be mapped to parameter name directly, 
stored it to map with the actual parameter
       if (annotation instanceof DefaultValue) {
-        this.defaultValue = ((DefaultValue) annotation).value();
+        defaultValue = ((DefaultValue) annotation).value();
       } else {
         ParameterAnnotationProcessor processor =
             
context.findParameterAnnotationProcessor(annotation.annotationType());
         if (processor != null) {
           processor.process(annotation, this, paramIdx);
+          parameter = 
this.providerParameters.get(this.providerParameters.size() - 1);
         }
       }
     }
+    if (parameter instanceof AbstractSerializableParameter && defaultValue != 
null) {
+      ((AbstractSerializableParameter<?>) 
parameter).setDefaultValue(defaultValue);
+    }
+
   }
 
   protected void processByParameterType(Type parameterType, int paramIdx) {
@@ -376,8 +382,4 @@ public class OperationGenerator {
     }
     pathObj.set(httpMethod, operation);
   }
-
-  public String getDefaultValue() {
-    return defaultValue;
-  }
 }
diff --git 
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java
 
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java
index 3cba80a..da3d14b 100644
--- 
a/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java
+++ 
b/swagger/swagger-generator/generator-core/src/main/java/org/apache/servicecomb/swagger/generator/core/processor/parameter/AbstractParameterProcessor.java
@@ -39,7 +39,7 @@ public abstract class AbstractParameterProcessor<T extends 
AbstractSerializableP
       T parameter) {
     setParameterName(annotation, operationGenerator, paramIdx, parameter);
     setParameterType(operationGenerator, paramIdx, parameter);
-    setParameterDefaultValue(annotation, operationGenerator, parameter);
+    setParameterDefaultValue(annotation, parameter);
   }
 
   protected void setParameterType(OperationGenerator operationGenerator, int 
paramIdx,
@@ -57,15 +57,10 @@ public abstract class AbstractParameterProcessor<T extends 
AbstractSerializableP
     parameter.setName(paramName);
   }
 
-  protected void setParameterDefaultValue(Object annotation, 
OperationGenerator operationGenerator, T parameter) {
-    String defaultValue = operationGenerator.getDefaultValue();
-    if (StringUtils.isNotEmpty(defaultValue)) {
-      parameter.setDefaultValue(defaultValue);
-    } else {
-      defaultValue = getAnnotationParameterDefaultValue(annotation);
+  protected void setParameterDefaultValue(Object annotation, T parameter) {
+    String defaultValue = getAnnotationParameterDefaultValue(annotation);
       if (StringUtils.isNotEmpty(defaultValue)) {
         parameter.setDefaultValue(defaultValue);
-      }
     }
 
   }

Reply via email to