[ 
https://issues.apache.org/jira/browse/SCB-713?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16533405#comment-16533405
 ] 

ASF GitHub Bot commented on SCB-713:
------------------------------------

liubao68 closed pull request #789: [SCB-713] @DefaulValue should be set only 
when input param is null
URL: https://github.com/apache/incubator-servicecomb-java-chassis/pull/789
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

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 47768c7bd..3ad7903fb 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 Object getValue(HttpServletRequest request) throws 
Exception {
       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 3605af580..81cf9125c 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 FormProcessor(String paramPath, JavaType targetType, 
Object defaultValue)
     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 Object getValue(HttpServletRequest request) {
       }
 
       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 16b60567d..52ea2b2b3 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 Object getValue(HttpServletRequest request) throws 
Exception {
         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 908f51210..231b6c9ce 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 Object getValue(HttpServletRequest request) throws 
Exception {
         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 64b4df8dc..8d31fee2b 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 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.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 static void run() throws Exception {
     testCompute(templateNew);
     testValidator(templateNew);
     testClientTimeOut(templateNew);
-    testDefaultValues(templateNew);
+    testJaxRSDefaultValues(templateNew);
   }
 
   private static void testCompute(RestTemplate template) throws Exception {
@@ -100,24 +104,96 @@ private static void testValidator(RestTemplate template) 
throws Exception {
     }
   }
 
-  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 a3688ba20..000000000
--- 
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 000000000..9a4159e53
--- /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 50f4b92c5..cc93248b5 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 @@
 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.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;
@@ -83,9 +89,8 @@ public static void run() {
       testController(templateUrlWithServiceName, microserviceName);
 
       testController();
-
-      testDefaultValues(templateUrlWithServiceName, microserviceName);
       testRequiredBody(templateUrlWithServiceName, microserviceName);
+      testSpringMvcDefaultValues(templateUrlWithServiceName, microserviceName);
     }
     HttpHeaders headers = new HttpHeaders();
     headers.set("Accept-Encoding", "gzip");
@@ -220,21 +225,6 @@ private static void testConfigurationDuplicate() {
         "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();
@@ -269,4 +259,84 @@ private static void testRequiredBody(RestTemplate 
template, String microserviceN
             String.class,
             "ha"));
   }
+
+  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);
+    }
+
+    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(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 57073c194..dd3f879d6 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 000000000..a67d8b22c
--- /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 49fa2a11a..40edc6795 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.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 @@
 
   protected String httpMethod;
 
-  protected String defaultValue;
-
   public OperationGenerator(SwaggerGenerator swaggerGenerator, Method 
providerMethod) {
     this.swaggerGenerator = swaggerGenerator;
     this.swagger = swaggerGenerator.swagger;
@@ -277,18 +276,25 @@ private boolean isArgumentNotProcessed(int 
swaggerParamCount) {
   }
 
   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 @@ protected void addOperationToSwagger() {
     }
     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 3cba80a58..da3d14b47 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 @@ protected void fillParameter(Object annotation, 
OperationGenerator operationGene
       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 @@ protected void setParameterName(Object annotation, 
OperationGenerator operationG
     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);
-      }
     }
 
   }


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


> @DefaulValue should be set only when input param is null
> --------------------------------------------------------
>
>                 Key: SCB-713
>                 URL: https://issues.apache.org/jira/browse/SCB-713
>             Project: Apache ServiceComb
>          Issue Type: Improvement
>          Components: Java-Chassis
>            Reporter: sukesh
>            Assignee: sukesh
>            Priority: Major
>             Fix For: java-chassis-1.0.0
>
>
> 1.Default value should not set when input is empty(a=)
> 2.Default value is not mapped correctly when order is changed
> 3.Invalid default value is set even not configured



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to