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

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

weichao666 closed pull request #914: [SCB-925] Springmvc, when have 
defaultValue, required should be false
URL: https://github.com/apache/incubator-servicecomb-java-chassis/pull/914
 
 
   

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/AbstractParamProcessor.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/AbstractParamProcessor.java
index 509e03e8c..dba683d7a 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/AbstractParamProcessor.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/AbstractParamProcessor.java
@@ -22,6 +22,8 @@
 public abstract class AbstractParamProcessor implements ParamValueProcessor {
   protected String paramPath;
 
+  protected boolean required = false;
+
   protected JavaType targetType;
 
   protected Object defaultValue;
@@ -30,8 +32,9 @@ public Object getDefaultValue() {
     return defaultValue;
   }
 
-  public AbstractParamProcessor(String paramPath, JavaType targetType, Object 
defaultValue) {
+  public AbstractParamProcessor(String paramPath, boolean required, JavaType 
targetType, Object defaultValue) {
     this.paramPath = paramPath;
+    this.required = required;
     this.targetType = targetType;
     this.defaultValue = defaultValue;
   }
@@ -39,4 +42,8 @@ public AbstractParamProcessor(String paramPath, JavaType 
targetType, Object defa
   public String getParameterPath() {
     return paramPath;
   }
+
+  public boolean isRequired() {
+    return required;
+  }
 }
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 659637e50..924be7aa2 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
@@ -21,9 +21,11 @@
 
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Response.Status;
 
 import org.apache.servicecomb.common.rest.codec.RestClientRequest;
 import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory;
+import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
@@ -35,8 +37,8 @@
   public static final String PARAMTYPE = "cookie";
 
   public static class CookieProcessor extends AbstractParamProcessor {
-    public CookieProcessor(String paramPath, JavaType targetType, Object 
defaultValue) {
-      super(paramPath, targetType, defaultValue);
+    public CookieProcessor(String paramPath, boolean required, JavaType 
targetType, Object defaultValue) {
+      super(paramPath, required, targetType, defaultValue);
     }
 
     @Override
@@ -51,6 +53,9 @@ public Object getValue(HttpServletRequest request) throws 
Exception {
         if (paramPath.equals(cookie.getName())) {
           value = cookie.getValue();
           if (value == null) {
+            if (isRequired()) {
+              throw new InvocationException(Status.BAD_REQUEST, "Parameter is 
not valid, required is true");
+            }
             Object defaultValue = getDefaultValue();
             if (defaultValue != null) {
               value = defaultValue.toString();
@@ -81,6 +86,6 @@ public CookieProcessorCreator() {
   @Override
   public ParamValueProcessor create(Parameter parameter, Type 
genericParamType) {
     JavaType targetType = 
TypeFactory.defaultInstance().constructType(genericParamType);
-    return new CookieProcessor(parameter.getName(), targetType, 
((CookieParameter) parameter).getDefaultValue());
+    return new CookieProcessor(parameter.getName(), parameter.getRequired(), 
targetType, ((CookieParameter) parameter).getDefaultValue());
   }
 }
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 81cf9125c..f34980f78 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
@@ -22,9 +22,11 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.Part;
+import javax.ws.rs.core.Response.Status;
 
 import org.apache.servicecomb.common.rest.RestConst;
 import org.apache.servicecomb.common.rest.codec.RestClientRequest;
+import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
@@ -37,8 +39,8 @@
   public static final String PARAMTYPE = "formData";
 
   public static class FormProcessor extends AbstractParamProcessor {
-    public FormProcessor(String paramPath, JavaType targetType, Object 
defaultValue) {
-      super(paramPath, targetType, defaultValue);
+    public FormProcessor(String paramPath, boolean required, JavaType 
targetType, Object defaultValue) {
+      super(paramPath, required, targetType, defaultValue);
     }
 
     @Override
@@ -55,6 +57,9 @@ public Object getValue(HttpServletRequest request) {
 
       Object value = request.getParameter(paramPath);
       if (value == null) {
+        if (isRequired()) {
+          throw new InvocationException(Status.BAD_REQUEST, "Parameter is not 
valid, required is true");
+        }
         Object defaultValue = getDefaultValue();
         if (defaultValue != null) {
           value = defaultValue;
@@ -84,9 +89,9 @@ public ParamValueProcessor create(Parameter parameter, Type 
genericParamType) {
     JavaType targetType = 
TypeFactory.defaultInstance().constructType(genericParamType);
 
     if (isPart(parameter)) {
-      return new PartProcessor(parameter.getName(), targetType, 
((FormParameter) parameter).getDefaultValue());
+      return new PartProcessor(parameter.getName(), parameter.getRequired(), 
targetType, ((FormParameter) parameter).getDefaultValue());
     }
-    return new FormProcessor(parameter.getName(), targetType, ((FormParameter) 
parameter).getDefaultValue());
+    return new FormProcessor(parameter.getName(), parameter.getRequired(), 
targetType, ((FormParameter) parameter).getDefaultValue());
   }
 
   private boolean isPart(Parameter parameter) {
@@ -94,8 +99,8 @@ private boolean isPart(Parameter parameter) {
   }
 
   private static class PartProcessor extends AbstractParamProcessor {
-    PartProcessor(String paramPath, JavaType targetType, Object defaultValue) {
-      super(paramPath, targetType, defaultValue);
+    PartProcessor(String paramPath, boolean required, JavaType targetType, 
Object defaultValue) {
+      super(paramPath, required, targetType, defaultValue);
     }
 
     @Override
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 810e01814..c7efbe451 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
@@ -22,9 +22,11 @@
 import java.util.Enumeration;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Response.Status;
 
 import org.apache.servicecomb.common.rest.codec.RestClientRequest;
 import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory;
+import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,8 +42,8 @@
   public static final String PARAMTYPE = "header";
 
   public static class HeaderProcessor extends AbstractParamProcessor {
-    public HeaderProcessor(String paramPath, JavaType targetType, Object 
defaultValue) {
-      super(paramPath, targetType, defaultValue);
+    public HeaderProcessor(String paramPath, boolean required, JavaType 
targetType, Object defaultValue) {
+      super(paramPath, required, targetType, defaultValue);
     }
 
     @Override
@@ -57,6 +59,9 @@ public Object getValue(HttpServletRequest request) throws 
Exception {
       } else {
         value = request.getHeader(paramPath);
         if (value == null) {
+          if (isRequired()) {
+            throw new InvocationException(Status.BAD_REQUEST, "Parameter is 
not valid, required is true");
+          }
           Object defaultValue = getDefaultValue();
           if (defaultValue != null) {
             value = defaultValue;
@@ -91,6 +96,6 @@ public HeaderProcessorCreator() {
   @Override
   public ParamValueProcessor create(Parameter parameter, Type 
genericParamType) {
     JavaType targetType = 
TypeFactory.defaultInstance().constructType(genericParamType);
-    return new HeaderProcessor(parameter.getName(), targetType, 
((HeaderParameter) parameter).getDefaultValue());
+    return new HeaderProcessor(parameter.getName(), parameter.getRequired(), 
targetType, ((HeaderParameter) parameter).getDefaultValue());
   }
 }
diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/PathProcessorCreator.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/PathProcessorCreator.java
index dbf459c80..9016c0d8f 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/PathProcessorCreator.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/PathProcessorCreator.java
@@ -36,8 +36,8 @@
   public static final String PARAMTYPE = "path";
 
   public static class PathProcessor extends AbstractParamProcessor {
-    public PathProcessor(String paramPath, JavaType targetType, Object 
defaultValue) {
-      super(paramPath, targetType, defaultValue);
+    public PathProcessor(String paramPath, boolean required, JavaType 
targetType, Object defaultValue) {
+      super(paramPath, required, targetType, defaultValue);
     }
 
     @Override
@@ -73,6 +73,6 @@ public PathProcessorCreator() {
   @Override
   public ParamValueProcessor create(Parameter parameter, Type 
genericParamType) {
     JavaType targetType = 
TypeFactory.defaultInstance().constructType(genericParamType);
-    return new PathProcessor(parameter.getName(), targetType, ((PathParameter) 
parameter).getDefaultValue());
+    return new PathProcessor(parameter.getName(), parameter.getRequired(), 
targetType, ((PathParameter) parameter).getDefaultValue());
   }
 }
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 713711ed8..bd6a1eaf4 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
@@ -20,9 +20,11 @@
 import java.lang.reflect.Type;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Response.Status;
 
 import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.common.rest.codec.RestClientRequest;
+import org.apache.servicecomb.swagger.invocation.exception.InvocationException;
 
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
@@ -42,8 +44,8 @@
     private boolean ignoreDefaultValue = DynamicPropertyFactory.getInstance()
         
.getBooleanProperty("servicecomb.rest.parameter.query.ignoreDefaultValue", 
false).get();
 
-    public QueryProcessor(String paramPath, JavaType targetType, Object 
defaultValue) {
-      super(paramPath, targetType, defaultValue);
+    public QueryProcessor(String paramPath, boolean required, JavaType 
targetType, Object defaultValue) {
+      super(paramPath, required, targetType, defaultValue);
     }
 
     @Override
@@ -60,6 +62,9 @@ public Object getValue(HttpServletRequest request) throws 
Exception {
           }
         }
         if (value == null) {
+          if (isRequired()) {
+            throw new InvocationException(Status.BAD_REQUEST, "Parameter is 
not valid, required is true");
+          }
           Object defaultValue = getDefaultValue();
           if (!ignoreDefaultValue && defaultValue != null) {
             value = defaultValue;
@@ -88,6 +93,6 @@ public QueryProcessorCreator() {
   @Override
   public ParamValueProcessor create(Parameter parameter, Type 
genericParamType) {
     JavaType targetType = 
TypeFactory.defaultInstance().constructType(genericParamType);
-    return new QueryProcessor(parameter.getName(), targetType, 
((QueryParameter) parameter).getDefaultValue());
+    return new QueryProcessor(parameter.getName(), parameter.getRequired(), 
targetType, ((QueryParameter) parameter).getDefaultValue());
   }
 }
diff --git 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestCookieProcessor.java
 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestCookieProcessor.java
index 370543494..292cde4e0 100644
--- 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestCookieProcessor.java
+++ 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestCookieProcessor.java
@@ -44,8 +44,12 @@
 
   RestClientRequest clientRequest;
 
-  private CookieProcessor createProcessor(String name, Class<?> type) {
-    return new CookieProcessor(name, 
TypeFactory.defaultInstance().constructType(type), null);
+  private CookieProcessor createProcessor(String name, boolean required, 
Class<?> type) {
+    return new CookieProcessor(name, required, 
TypeFactory.defaultInstance().constructType(type), null);
+  }
+
+  private CookieProcessor createProcessor(String name, boolean required, 
Class<?> type, String defaultValue) {
+    return new CookieProcessor(name, required, 
TypeFactory.defaultInstance().constructType(type), defaultValue);
   }
 
   private void createClientRequest() {
@@ -66,7 +70,7 @@ public void testGetValueNoCookies() throws Exception {
       }
     };
 
-    CookieProcessor processor = createProcessor("c1", String.class);
+    CookieProcessor processor = createProcessor("c1", true, String.class);
     Object value = processor.getValue(request);
     Assert.assertNull(value);
   }
@@ -81,7 +85,7 @@ public void testGetValueCookiesNotFound() throws Exception {
       }
     };
 
-    CookieProcessor processor = createProcessor("c2", String.class);
+    CookieProcessor processor = createProcessor("c2", true, String.class);
     Object value = processor.getValue(request);
     Assert.assertNull(value);
   }
@@ -96,11 +100,45 @@ public void testGetValueCookiesFound() throws Exception {
       }
     };
 
-    CookieProcessor processor = createProcessor("c1", String.class);
+    CookieProcessor processor = createProcessor("c1", true, String.class);
     Object value = processor.getValue(request);
     Assert.assertEquals("c1v", value);
   }
 
+  @Test
+  public void testGetValueRequiredTrue() throws Exception {
+    Cookie[] cookies = new Cookie[] {new Cookie("c1", null)};
+    new Expectations() {
+      {
+        request.getCookies();
+        result = cookies;
+      }
+    };
+
+    CookieProcessor processor = createProcessor("c1", true, String.class);
+    try {
+      processor.getValue(request);
+      Assert.assertEquals("required is true, throw exception", "not throw 
exception");
+    } catch (Exception e) {
+      Assert.assertTrue(e.getMessage().contains("Parameter is not valid, 
required is true"));
+    }
+  }
+
+  @Test
+  public void testGetValueRequiredFalse() throws Exception {
+    Cookie[] cookies = new Cookie[] {new Cookie("c1", null)};
+    new Expectations() {
+      {
+        request.getCookies();
+        result = cookies;
+      }
+    };
+
+    CookieProcessor processor = createProcessor("c1", false, String.class, 
"test");
+    Object result = processor.getValue(request);
+    Assert.assertEquals("test", result);
+  }
+
   @SuppressWarnings("deprecation")
   @Test
   public void testGetValueCookiesDate() throws Exception {
@@ -114,7 +152,7 @@ public void testGetValueCookiesDate() throws Exception {
       }
     };
 
-    CookieProcessor processor = createProcessor("c1", Date.class);
+    CookieProcessor processor = createProcessor("c1", true, Date.class);
     Object value = processor.getValue(request);
     Assert.assertEquals(strDate, 
com.fasterxml.jackson.databind.util.ISO8601Utils.format((Date) value));
   }
@@ -123,7 +161,7 @@ public void testGetValueCookiesDate() throws Exception {
   public void testSetValue() throws Exception {
     createClientRequest();
 
-    CookieProcessor processor = createProcessor("c1", String.class);
+    CookieProcessor processor = createProcessor("c1", true, String.class);
     processor.setValue(clientRequest, "c1v");
     Assert.assertEquals("c1v", cookies.get("c1"));
   }
@@ -136,14 +174,14 @@ public void testSetValueDate() throws Exception {
 
     createClientRequest();
 
-    CookieProcessor processor = createProcessor("h1", Date.class);
+    CookieProcessor processor = createProcessor("h1", true, Date.class);
     processor.setValue(clientRequest, date);
     Assert.assertEquals(strDate, cookies.get("h1"));
   }
 
   @Test
   public void testGetProcessorType() {
-    CookieProcessor processor = createProcessor("c1", String.class);
+    CookieProcessor processor = createProcessor("c1", true, String.class);
     Assert.assertEquals("cookie", processor.getProcessorType());
   }
 }
diff --git 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestFormProcessor.java
 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestFormProcessor.java
index a75694058..089818c71 100644
--- 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestFormProcessor.java
+++ 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestFormProcessor.java
@@ -47,8 +47,12 @@
 
   RestClientRequest clientRequest;
 
-  private FormProcessor createProcessor(String name, Class<?> type) {
-    return new FormProcessor(name, 
TypeFactory.defaultInstance().constructType(type), null);
+  private FormProcessor createProcessor(String name, boolean required, 
Class<?> type) {
+    return new FormProcessor(name, required, 
TypeFactory.defaultInstance().constructType(type), null);
+  }
+
+  private FormProcessor createProcessor(String name, boolean required, 
Class<?> type, String defaultValue) {
+    return new FormProcessor(name, required, 
TypeFactory.defaultInstance().constructType(type), defaultValue);
   }
 
   private void createClientRequest() {
@@ -71,7 +75,7 @@ public void testGetValueWithAttr() throws Exception {
       }
     };
 
-    ParamValueProcessor processor = createProcessor("name", String.class);
+    ParamValueProcessor processor = createProcessor("name", true, 
String.class);
     Object value = processor.getValue(request);
     Assert.assertEquals("value", value);
   }
@@ -85,7 +89,7 @@ public void testGetValueNormal() throws Exception {
       }
     };
 
-    ParamValueProcessor processor = createProcessor("name", String.class);
+    ParamValueProcessor processor = createProcessor("name", true, 
String.class);
     Object value = processor.getValue(request);
     Assert.assertEquals("value", value);
   }
@@ -103,7 +107,7 @@ public void testGetValueNormalDate() throws Exception {
       }
     };
 
-    ParamValueProcessor processor = createProcessor("name", Date.class);
+    ParamValueProcessor processor = createProcessor("name", true, Date.class);
     Object value = processor.getValue(request);
     Assert.assertEquals(strDate, 
com.fasterxml.jackson.databind.util.ISO8601Utils.format((Date) value));
   }
@@ -117,11 +121,43 @@ public void testGetValueContainerTypeNull() throws 
Exception {
       }
     };
 
-    ParamValueProcessor processor = createProcessor("name", String[].class);
+    ParamValueProcessor processor = createProcessor("name", true, 
String[].class);
     String[] value = (String[]) processor.getValue(request);
     Assert.assertNull(value);
   }
 
+  @Test
+  public void testGetValueRequiredTrue() throws Exception {
+    new Expectations() {
+      {
+        request.getParameter("name");
+        result = null;
+      }
+    };
+
+    ParamValueProcessor processor = createProcessor("name", true, 
String.class);
+    try {
+      processor.getValue(request);
+      Assert.assertEquals("required is true, throw exception", "not throw 
exception");
+    } catch (Exception e) {
+      Assert.assertTrue(e.getMessage().contains("Parameter is not valid, 
required is true"));
+    }
+  }
+
+  @Test
+  public void testGetValueRequiredFalse() throws Exception {
+    new Expectations() {
+      {
+        request.getParameter("name");
+        result = null;
+      }
+    };
+
+    ParamValueProcessor processor = createProcessor("name", false, 
String.class, "test");
+    Object result = processor.getValue(request);
+    Assert.assertEquals("test", result);
+  }
+
   @Test
   public void testGetValueArray() throws Exception {
     new Expectations() {
@@ -131,7 +167,7 @@ public void testGetValueArray() throws Exception {
       }
     };
 
-    ParamValueProcessor processor = createProcessor("name", String[].class);
+    ParamValueProcessor processor = createProcessor("name", true, 
String[].class);
     String[] value = (String[]) processor.getValue(request);
     Assert.assertThat(value, Matchers.arrayContaining("value"));
   }
@@ -147,7 +183,7 @@ public void testGetValueList() throws Exception {
     };
 
     ParamValueProcessor processor =
-        new FormProcessor("name", 
TypeFactory.defaultInstance().constructCollectionType(List.class, String.class),
+        new FormProcessor("name", true, 
TypeFactory.defaultInstance().constructCollectionType(List.class, String.class),
             null);
     Object value = processor.getValue(request);
     Assert.assertThat((List<String>) value, Matchers.contains("value"));
@@ -164,7 +200,8 @@ public void testGetValueSet() throws Exception {
     };
 
     ParamValueProcessor processor =
-        new FormProcessor("name", 
TypeFactory.defaultInstance().constructCollectionType(Set.class, String.class), 
null);
+        new FormProcessor("name", true, 
TypeFactory.defaultInstance().constructCollectionType(Set.class, String.class),
+            null);
     Object value = processor.getValue(request);
     Assert.assertThat((Set<String>) value, Matchers.contains("value"));
   }
@@ -173,7 +210,7 @@ public void testGetValueSet() throws Exception {
   public void testSetValue() throws Exception {
     createClientRequest();
 
-    ParamValueProcessor processor = createProcessor("name", String.class);
+    ParamValueProcessor processor = createProcessor("name", true, 
String.class);
     processor.setValue(clientRequest, "value");
     Assert.assertEquals("value", forms.get("name"));
   }
@@ -184,14 +221,14 @@ public void testSetValueDate() throws Exception {
 
     createClientRequest();
 
-    ParamValueProcessor processor = createProcessor("name", Date.class);
+    ParamValueProcessor processor = createProcessor("name", true, Date.class);
     processor.setValue(clientRequest, date);
     Assert.assertSame(date, forms.get("name"));
   }
 
   @Test
   public void testGetProcessorType() {
-    ParamValueProcessor processor = createProcessor("name", String.class);
+    ParamValueProcessor processor = createProcessor("name", true, 
String.class);
     Assert.assertEquals("formData", processor.getProcessorType());
   }
 }
diff --git 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestHeaderProcessor.java
 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestHeaderProcessor.java
index 667e53ba7..acd97098b 100644
--- 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestHeaderProcessor.java
+++ 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestHeaderProcessor.java
@@ -48,8 +48,12 @@
 
   RestClientRequest clientRequest;
 
-  private HeaderProcessor createProcessor(String name, Class<?> type) {
-    return new HeaderProcessor(name, 
TypeFactory.defaultInstance().constructType(type), null);
+  private HeaderProcessor createProcessor(String name, boolean required, 
Class<?> type) {
+    return new HeaderProcessor(name, required, 
TypeFactory.defaultInstance().constructType(type), null);
+  }
+
+  private HeaderProcessor createProcessor(String name, boolean required, 
Class<?> type, String defaultValue) {
+    return new HeaderProcessor(name, required, 
TypeFactory.defaultInstance().constructType(type), defaultValue);
   }
 
   private void createClientRequest() {
@@ -70,7 +74,7 @@ public void testGetValueNormal() throws Exception {
       }
     };
 
-    HeaderProcessor processor = createProcessor("h1", String.class);
+    HeaderProcessor processor = createProcessor("h1", true, String.class);
     Object value = processor.getValue(request);
     Assert.assertEquals("h1v", value);
   }
@@ -88,7 +92,7 @@ public void testGetValueNormalDate() throws Exception {
       }
     };
 
-    HeaderProcessor processor = createProcessor("h1", Date.class);
+    HeaderProcessor processor = createProcessor("h1", true, Date.class);
     Object value = processor.getValue(request);
     Assert.assertEquals(strDate, 
com.fasterxml.jackson.databind.util.ISO8601Utils.format((Date) value));
   }
@@ -102,11 +106,44 @@ public void testGetValueContainerTypeNull() throws 
Exception {
       }
     };
 
-    HeaderProcessor processor = createProcessor("h1", String[].class);
+    HeaderProcessor processor = createProcessor("h1", true, String[].class);
     String[] value = (String[]) processor.getValue(request);
     Assert.assertNull(value);
   }
 
+  @Test
+  public void testGetValueRequiredTrue() throws Exception {
+    new Expectations() {
+      {
+        request.getHeader("h1");
+        result = null;
+      }
+    };
+
+    HeaderProcessor processor = createProcessor("h1", true, String.class);
+    try {
+      processor.getValue(request);
+      Assert.assertEquals("required is true, throw exception", "not throw 
exception");
+    } catch (Exception e) {
+      Assert.assertTrue(e.getMessage().contains("Parameter is not valid, 
required is true"));
+    }
+
+  }
+
+  @Test
+  public void testGetValueRequiredFalse() throws Exception {
+    new Expectations() {
+      {
+        request.getHeader("h1");
+        result = null;
+      }
+    };
+
+    HeaderProcessor processor = createProcessor("h1", false, String.class, 
"test");
+    Object value = processor.getValue(request);
+    Assert.assertEquals("test", value);
+  }
+
   @Test
   public void testGetValueArray() throws Exception {
     new Expectations() {
@@ -116,7 +153,7 @@ public void testGetValueArray() throws Exception {
       }
     };
 
-    HeaderProcessor processor = createProcessor("h1", String[].class);
+    HeaderProcessor processor = createProcessor("h1", true, String[].class);
     String[] value = (String[]) processor.getValue(request);
     Assert.assertThat(value, Matchers.arrayContaining("h1v"));
   }
@@ -132,7 +169,7 @@ public void testGetValueList() throws Exception {
     };
 
     HeaderProcessor processor =
-        new HeaderProcessor("h1", 
TypeFactory.defaultInstance().constructCollectionType(List.class, String.class),
+        new HeaderProcessor("h1", true, 
TypeFactory.defaultInstance().constructCollectionType(List.class, String.class),
             null);
     Object value = processor.getValue(request);
     Assert.assertThat((List<String>) value, Matchers.contains("h1v"));
@@ -149,7 +186,8 @@ public void testGetValueSet() throws Exception {
     };
 
     HeaderProcessor processor =
-        new HeaderProcessor("h1", 
TypeFactory.defaultInstance().constructCollectionType(Set.class, String.class), 
null);
+        new HeaderProcessor("h1", true, 
TypeFactory.defaultInstance().constructCollectionType(Set.class, String.class),
+            null);
     Object value = processor.getValue(request);
     Assert.assertThat((Set<String>) value, Matchers.contains("h1v"));
   }
@@ -158,7 +196,7 @@ public void testGetValueSet() throws Exception {
   public void testSetValue() throws Exception {
     createClientRequest();
 
-    HeaderProcessor processor = createProcessor("h1", String.class);
+    HeaderProcessor processor = createProcessor("h1", true, String.class);
     processor.setValue(clientRequest, "h1v");
     Assert.assertEquals("h1v", headers.get("h1"));
   }
@@ -166,7 +204,7 @@ public void testSetValue() throws Exception {
   @Test
   public void testSetValueNull() throws Exception {
     createClientRequest();
-    HeaderProcessor processor = createProcessor("h1", String.class);
+    HeaderProcessor processor = createProcessor("h1", true, String.class);
     processor.setValue(clientRequest, null);
     Assert.assertEquals(0, headers.size());
   }
@@ -179,14 +217,14 @@ public void testSetValueDate() throws Exception {
 
     createClientRequest();
 
-    HeaderProcessor processor = createProcessor("h1", Date.class);
+    HeaderProcessor processor = createProcessor("h1", true, Date.class);
     processor.setValue(clientRequest, date);
     Assert.assertEquals(strDate, headers.get("h1"));
   }
 
   @Test
   public void testGetProcessorType() {
-    HeaderProcessor processor = createProcessor("h1", String.class);
+    HeaderProcessor processor = createProcessor("h1", true, String.class);
     Assert.assertEquals("header", processor.getProcessorType());
   }
 }
diff --git 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestPathProcessor.java
 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestPathProcessor.java
index 19cd51f7e..5a954d83b 100644
--- 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestPathProcessor.java
+++ 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestPathProcessor.java
@@ -40,12 +40,12 @@
 
   ParamValueProcessor processor;
 
-  private void createProcessor(String name, Class<?> type) {
-    processor = new PathProcessor(name, 
TypeFactory.defaultInstance().constructType(type), null);
+  private void createProcessor(String name, boolean required, Class<?> type) {
+    processor = new PathProcessor(name, required, 
TypeFactory.defaultInstance().constructType(type), null);
   }
 
   private void prepareGetValue(String name, Class<?> type) {
-    createProcessor(name, type);
+    createProcessor(name, true, type);
     new Expectations() {
       {
         request.getAttribute(RestConst.PATH_PARAMETERS);
@@ -56,7 +56,7 @@ private void prepareGetValue(String name, Class<?> type) {
 
   @Test
   public void testGetValueNoPathVars() throws Exception {
-    createProcessor("name", String.class);
+    createProcessor("name", true, String.class);
 
     Assert.assertEquals(null, processor.getValue(request));
   }
@@ -102,7 +102,7 @@ public void testGetPercentage() throws Exception {
 
   @Test
   public void testGetProcessorType() {
-    createProcessor("name", String.class);
+    createProcessor("name", true, String.class);
     Assert.assertEquals("path", processor.getProcessorType());
   }
 }
diff --git 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestQueryProcessor.java
 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestQueryProcessor.java
index 75f1ee040..88aa4e9d3 100644
--- 
a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestQueryProcessor.java
+++ 
b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/param/TestQueryProcessor.java
@@ -33,8 +33,12 @@
   @Mocked
   HttpServletRequest request;
 
-  private ParamValueProcessor createProcessor(String name, Class<?> type) {
-    return new QueryProcessor(name, 
TypeFactory.defaultInstance().constructType(type), null);
+  private ParamValueProcessor createProcessor(String name, boolean required, 
Class<?> type) {
+    return new QueryProcessor(name, required, 
TypeFactory.defaultInstance().constructType(type), null);
+  }
+
+  private ParamValueProcessor createProcessor(String name, boolean required, 
Class<?> type, String defaultValue) {
+    return new QueryProcessor(name, required, 
TypeFactory.defaultInstance().constructType(type), defaultValue);
   }
 
   @Test
@@ -46,7 +50,7 @@ public void testGetValueNormal() throws Exception {
       }
     };
 
-    ParamValueProcessor processor = createProcessor("name", String.class);
+    ParamValueProcessor processor = createProcessor("name", true, 
String.class);
     Object value = processor.getValue(request);
     Assert.assertEquals("value", value);
   }
@@ -60,14 +64,46 @@ public void testGetValueContainerType() throws Exception {
       }
     };
 
-    ParamValueProcessor processor = createProcessor("name", String[].class);
+    ParamValueProcessor processor = createProcessor("name", true, 
String[].class);
     String[] value = (String[]) processor.getValue(request);
     Assert.assertThat(value, Matchers.arrayContaining("value"));
   }
 
   @Test
   public void testGetProcessorType() {
-    ParamValueProcessor processor = createProcessor("name", String.class);
+    ParamValueProcessor processor = createProcessor("name", true, 
String.class);
     Assert.assertEquals("query", processor.getProcessorType());
   }
+
+  @Test
+  public void testGetValueRequiredTrue() throws Exception {
+    new Expectations() {
+      {
+        request.getParameter("name");
+        result = null;
+      }
+    };
+
+    ParamValueProcessor processor = createProcessor("name", true, 
String.class);
+    try {
+      processor.getValue(request);
+      Assert.assertEquals("required is true, throw exception", "not throw 
exception");
+    } catch (Exception e) {
+      Assert.assertTrue(e.getMessage().contains("Parameter is not valid, 
required is true"));
+    }
+  }
+
+  @Test
+  public void testGetValueRequiredFalse() throws Exception {
+    new Expectations() {
+      {
+        request.getParameter("name");
+        result = null;
+      }
+    };
+
+    ParamValueProcessor processor = createProcessor("name", false, 
String.class, "test");
+    Object result = processor.getValue(request);
+    Assert.assertEquals("test", result);
+  }
 }
diff --git a/demo/demo-schema/src/main/resources/microservices/pojo/server.yaml 
b/demo/demo-schema/src/main/resources/microservices/pojo/server.yaml
index 985fcb71e..15b1d8270 100644
--- a/demo/demo-schema/src/main/resources/microservices/pojo/server.yaml
+++ b/demo/demo-schema/src/main/resources/microservices/pojo/server.yaml
@@ -57,7 +57,7 @@ paths:
       parameters:
         - name: code
           in: query
-          required: true
+          required: false
           type: string
       responses:
         200:
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
index d6b33ebe4..3e9150962 100644
--- 
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
@@ -61,7 +61,7 @@ public String query2(@RequestParam(name = "e", required = 
false) int e,
   }
 
   @GetMapping("/query3")
-  public String query3(@RequestParam("a") @Min(value = 20) int a, 
@RequestParam("b") String b) {
+  public String query3(@RequestParam("a") @Min(value = 20) int a, 
@RequestParam(name = "b", required = false) String b) {
     return "Hello " + a + b;
   }
 
diff --git 
a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestDefaultValue.java
 
b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestDefaultValue.java
index c356ad2d3..4566c9290 100644
--- 
a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestDefaultValue.java
+++ 
b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestDefaultValue.java
@@ -240,23 +240,41 @@ public void stringHeader_require_springmvc_rt() {
 
   @Test
   public void intForm_require_springmvc_intf() {
-    assertEquals(defaultInt, 
consumersSpringmvc.getIntf().intFormRequire(null));
+    try {
+      consumersSpringmvc.getIntf().intFormRequire(null);
+      assertEquals("required is true, throw exception", "but not throw 
exception");
+    } catch (Exception e) {
+      assertEquals(true, e.getMessage().contains("Parameter is not valid"));
+    }
   }
 
   @Test
   public void stringForm_require_springmvc_intf() {
-    assertEquals(defaultStr, 
consumersSpringmvc.getIntf().stringFormRequire(null));
+    try {
+      consumersSpringmvc.getIntf().stringFormRequire(null);
+      assertEquals("required is true, throw exception", "but not throw 
exception");
+    } catch (Exception e) {
+      assertEquals(true, e.getMessage().contains("Parameter is not valid"));
+    }
   }
 
   @Test
   public void intForm_require_springmvc_rt() {
-    assertEquals(defaultInt,
-        (int) 
consumersSpringmvc.getSCBRestTemplate().postForObject("/intFormRequire", null, 
int.class));
+    try {
+      consumersSpringmvc.getSCBRestTemplate().postForObject("/intFormRequire", 
null, int.class);
+      assertEquals("required is true, throw exception", "but not throw 
exception");
+    } catch (Exception e) {
+      assertEquals(true, e.getMessage().contains("Parameter is not valid"));
+    }
   }
 
   @Test
   public void stringForm_require_springmvc_rt() {
-    assertEquals(defaultStr,
-        (String) 
consumersSpringmvc.getSCBRestTemplate().postForObject("/stringFormRequire", 
null, String.class));
+    try {
+      
consumersSpringmvc.getSCBRestTemplate().postForObject("/stringFormRequire", 
null, String.class);
+      assertEquals("required is true, throw exception", "but not throw 
exception");
+    } catch (Exception e) {
+      assertEquals(true, e.getMessage().contains("Parameter is not valid"));
+    }
   }
 }
diff --git 
a/integration-tests/springmvc-tests/springmvc-tests-common/src/test/java/org/apache/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvc.java
 
b/integration-tests/springmvc-tests/springmvc-tests-common/src/test/java/org/apache/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvc.java
index c235b7999..0a47f1f7b 100644
--- 
a/integration-tests/springmvc-tests/springmvc-tests-common/src/test/java/org/apache/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvc.java
+++ 
b/integration-tests/springmvc-tests/springmvc-tests-common/src/test/java/org/apache/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvc.java
@@ -98,7 +98,7 @@ public String fileUpload(@RequestPart(name = "file1") 
MultipartFile file1,
 
   @RequestMapping(path = "/uploadWithoutAnnotation", method = 
RequestMethod.POST, produces = MediaType.TEXT_PLAIN_VALUE, consumes = 
MediaType.MULTIPART_FORM_DATA_VALUE)
   public String fileUploadWithoutAnnotation(MultipartFile file1, MultipartFile 
file2,
-      @RequestAttribute("name") String name) {
+      @RequestAttribute(name = "name", required = false) String name) {
     return super.fileUpload(file1, file2, name);
   }
 
diff --git 
a/integration-tests/springmvc-tests/springmvc-tests-common/src/test/java/org/apache/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcSimplifiedMappingAnnotation.java
 
b/integration-tests/springmvc-tests/springmvc-tests-common/src/test/java/org/apache/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcSimplifiedMappingAnnotation.java
index 65e6b8ccd..1d73d15b6 100644
--- 
a/integration-tests/springmvc-tests/springmvc-tests-common/src/test/java/org/apache/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcSimplifiedMappingAnnotation.java
+++ 
b/integration-tests/springmvc-tests/springmvc-tests-common/src/test/java/org/apache/servicecomb/demo/springmvc/tests/endpoints/CodeFirstSpringmvcSimplifiedMappingAnnotation.java
@@ -101,7 +101,7 @@ public String fileUpload(@RequestPart(name = "file1") 
MultipartFile file1,
 
   @PostMapping(path = "/uploadWithoutAnnotation", produces = 
MediaType.TEXT_PLAIN_VALUE)
   public String fileUploadWithoutAnnotation(MultipartFile file1, MultipartFile 
file2,
-      @RequestAttribute("name") String name) {
+      @RequestAttribute(name = "name", required = false) String name) {
     return super.fileUpload(file1, file2, name);
   }
 
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 04d992cb5..7ef68e449 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
@@ -59,10 +59,9 @@ protected void setParameterName(Object annotation, 
OperationGenerator operationG
 
   protected void setParameterDefaultValue(Object annotation, T parameter) {
     String defaultValue = getAnnotationParameterDefaultValue(annotation);
-      if (StringUtils.isNotEmpty(defaultValue)) {
+    if (StringUtils.isNotEmpty(defaultValue)) {
         parameter.setDefaultValue(defaultValue);
     }
-
   }
 
   protected String getAnnotationParameterDefaultValue(Object annotation) {
diff --git 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java
 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java
index a86ea06bb..ffb1d3848 100644
--- 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java
+++ 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/CookieValueAnnotationProcessor.java
@@ -17,6 +17,7 @@
 
 package 
org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
 import 
org.apache.servicecomb.swagger.generator.core.processor.parameter.AbstractParameterProcessor;
 import org.springframework.web.bind.annotation.CookieValue;
@@ -40,6 +41,11 @@ protected void fillParameter(Object annotation, 
OperationGenerator operationGene
       CookieParameter parameter) {
     super.fillParameter(annotation, operationGenerator, paramIdx, parameter);
 
+    String defaultValue = getAnnotationParameterDefaultValue(annotation);
+    if (StringUtils.isNotEmpty(defaultValue)) {
+      parameter.setRequired(false);
+      return;
+    }
     CookieValue cookie = (CookieValue) annotation;
     parameter.setRequired(cookie.required());
   }
diff --git 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java
 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java
index 6297ef775..f51a1bba0 100644
--- 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java
+++ 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/PathVariableAnnotationProcessor.java
@@ -17,6 +17,7 @@
 
 package 
org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
 import 
org.apache.servicecomb.swagger.generator.core.processor.parameter.AbstractParameterProcessor;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -39,6 +40,11 @@ protected void fillParameter(Object annotation, 
OperationGenerator operationGene
       PathParameter parameter) {
     super.fillParameter(annotation, operationGenerator, paramIdx, parameter);
 
+    String defaultValue = getAnnotationParameterDefaultValue(annotation);
+    if (StringUtils.isNotEmpty(defaultValue)) {
+      parameter.setRequired(false);
+      return;
+    }
     PathVariable pathVariable = (PathVariable) annotation;
     parameter.setRequired(pathVariable.required()); 
   }
diff --git 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
index 0166a762a..4659fc396 100644
--- 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
+++ 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestAttributeAnnotationProcessor.java
@@ -17,6 +17,7 @@
 
 package 
org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
 import 
org.apache.servicecomb.swagger.generator.core.processor.parameter.AbstractParameterProcessor;
 import org.springframework.web.bind.annotation.RequestAttribute;
@@ -39,6 +40,11 @@ protected void fillParameter(Object annotation, 
OperationGenerator operationGene
       FormParameter parameter) {
     super.fillParameter(annotation, operationGenerator, paramIdx, parameter);
 
+    String defaultValue = getAnnotationParameterDefaultValue(annotation);
+    if (StringUtils.isNotEmpty(defaultValue)) {
+      parameter.setRequired(false);
+      return;
+    }
     RequestAttribute requestAttribute = (RequestAttribute) annotation;
     parameter.setRequired(requestAttribute.required()); 
   }
diff --git 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
index d4862de33..3d319bd80 100644
--- 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
+++ 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestHeaderAnnotationProcessor.java
@@ -17,6 +17,7 @@
 
 package 
org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
 import 
org.apache.servicecomb.swagger.generator.core.processor.parameter.AbstractParameterProcessor;
 import org.springframework.web.bind.annotation.RequestHeader;
@@ -40,6 +41,11 @@ protected void fillParameter(Object annotation, 
OperationGenerator operationGene
       HeaderParameter parameter) {
     super.fillParameter(annotation, operationGenerator, paramIdx, parameter);
 
+    String defaultValue = getAnnotationParameterDefaultValue(annotation);
+    if (StringUtils.isNotEmpty(defaultValue)) {
+      parameter.setRequired(false);
+      return;
+    }
     RequestHeader requestHeader = (RequestHeader) annotation;
     parameter.setRequired(requestHeader.required());
   }
diff --git 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamAnnotationProcessor.java
 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamAnnotationProcessor.java
index a32274bfb..e03ff10da 100644
--- 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamAnnotationProcessor.java
+++ 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestParamAnnotationProcessor.java
@@ -17,6 +17,7 @@
 
 package 
org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
 import 
org.apache.servicecomb.swagger.generator.core.processor.parameter.AbstractParameterProcessor;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -40,6 +41,11 @@ protected void fillParameter(Object annotation, 
OperationGenerator operationGene
       QueryParameter parameter) {
     super.fillParameter(annotation, operationGenerator, paramIdx, parameter);
 
+    String defaultValue = getAnnotationParameterDefaultValue(annotation);
+    if (StringUtils.isNotEmpty(defaultValue)) {
+      parameter.setRequired(false);
+      return;
+    }
     RequestParam requestParam = (RequestParam) annotation;
     parameter.setRequired(requestParam.required());
   }
diff --git 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
index fe3ec24ca..ce270cd01 100644
--- 
a/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
+++ 
b/swagger/swagger-generator/generator-springmvc/src/main/java/org/apache/servicecomb/swagger/generator/springmvc/processor/annotation/RequestPartAnnotationProcessor.java
@@ -17,6 +17,7 @@
 
 package 
org.apache.servicecomb.swagger.generator.springmvc.processor.annotation;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.servicecomb.swagger.generator.core.OperationGenerator;
 import 
org.apache.servicecomb.swagger.generator.core.processor.parameter.AbstractParameterProcessor;
 import org.springframework.web.bind.annotation.RequestPart;
@@ -39,6 +40,11 @@ protected void fillParameter(Object annotation, 
OperationGenerator operationGene
       FormParameter parameter) {
     super.fillParameter(annotation, operationGenerator, paramIdx, parameter);
 
+    String defaultValue = getAnnotationParameterDefaultValue(annotation);
+    if (StringUtils.isNotEmpty(defaultValue)) {
+      parameter.setRequired(false);
+      return;
+    }
     RequestPart requestPart = (RequestPart) annotation;
     parameter.setRequired(requestPart.required());
   }


 

----------------------------------------------------------------
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]


> Springmvc, when have defaultValue, required should be false
> -----------------------------------------------------------
>
>                 Key: SCB-925
>                 URL: https://issues.apache.org/jira/browse/SCB-925
>             Project: Apache ServiceComb
>          Issue Type: Bug
>          Components: Java-Chassis
>            Reporter: WeiChao
>            Assignee: WeiChao
>            Priority: Major
>             Fix For: java-chassis-1.1.0
>
>




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

Reply via email to