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 44cd5bc7a9e6d48dcd3df0244008a815fa545270
Author: liubao <[email protected]>
AuthorDate: Thu Aug 16 19:50:42 2018 +0800

    [SCB-847]support client not write null value and server write null value.
---
 .../common/rest/codec/RestObjectMapperFactory.java | 23 +++++++
 .../rest/codec/param/BodyProcessorCreator.java     |  7 +-
 .../rest/codec/param/CookieProcessorCreator.java   |  3 +-
 .../rest/codec/param/HeaderProcessorCreator.java   |  3 +-
 .../rest/codec/param/ParamValueProcessor.java      |  3 +-
 .../rest/codec/produce/ProduceJsonProcessor.java   |  5 +-
 .../servicecomb/demo/jaxrs/client/JaxrsClient.java |  9 ++-
 .../jaxrs/client/pojoDefault/DefaultModel.java     | 17 ++---
 .../pojoDefault/DefaultModelServiceClient.java     | 46 +++++++++++++
 .../server/pojoDefault/DefaultResponseModel.java   | 76 ++++++++++++++++++++++
 .../servicecomb/demo/jaxrs/server/JaxrsServer.java |  7 +-
 .../server/pojoDefault/DefaultModelService.java    | 27 ++++----
 .../server/pojoDefault/DefaultRequestModel.java    | 76 ++++++++++++++++++++++
 .../server/pojoDefault/DefaultResponseModel.java   | 76 ++++++++++++++++++++++
 .../demo/RestObjectMapperWithStringMapper.java     |  2 +
 15 files changed, 349 insertions(+), 31 deletions(-)

diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestObjectMapperFactory.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestObjectMapperFactory.java
index 188d9de..65b107e 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestObjectMapperFactory.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestObjectMapperFactory.java
@@ -17,12 +17,31 @@
 
 package org.apache.servicecomb.common.rest.codec;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Manage RestObjectMapper instances. Give users an option to specify custom 
mappers.
  */
 public class RestObjectMapperFactory {
+  public static final String KEY_PROVIDER_READ_OR_CONSUMER_READ = 
"provider.consumer.read";
+
+  public static final String KEY_PROVIDER_WRITE = "provider.write";
+
+  public static final String KEY_CONSUMER_WRITE = "consumer.write";
+
   private static AbstractRestObjectMapper defaultMapper = new 
RestObjectMapper();
 
+  private static Map<String, AbstractRestObjectMapper> allMappers = new 
HashMap<>();
+
+  public static AbstractRestObjectMapper getRestObjectMapper(String key) {
+    AbstractRestObjectMapper mapper = allMappers.get(key);
+    if (mapper != null) {
+      return mapper;
+    }
+    return defaultMapper;
+  }
+
   public static AbstractRestObjectMapper getRestObjectMapper() {
     return defaultMapper;
   }
@@ -30,4 +49,8 @@ public class RestObjectMapperFactory {
   public static void setDefaultRestObjectMapper(AbstractRestObjectMapper 
customMapper) {
     defaultMapper = customMapper;
   }
+
+  public static void setCustomMapper(String key, AbstractRestObjectMapper 
mapper) {
+    allMappers.put(key, mapper);
+  }
 }
diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java
index 61f0ea9..fc40579 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/BodyProcessorCreator.java
@@ -68,7 +68,7 @@ public class BodyProcessorCreator implements 
ParamValueProcessorCreator {
       contentType = contentType == null ? "" : 
contentType.toLowerCase(Locale.US);
       if (contentType.startsWith(MediaType.MULTIPART_FORM_DATA)
           || contentType.startsWith(MediaType.APPLICATION_FORM_URLENCODED)) {
-        return 
RestObjectMapperFactory.getRestObjectMapper().convertValue(request.getParameterMap(),
 targetType);
+        return convertValue(request.getParameterMap(), targetType);
       }
 
       // for standard HttpServletRequest, getInputStream will never return null
@@ -85,7 +85,8 @@ public class BodyProcessorCreator implements 
ParamValueProcessorCreator {
       }
 
       try {
-        return 
RestObjectMapperFactory.getRestObjectMapper().readValue(inputStream, 
targetType);
+        return 
RestObjectMapperFactory.getRestObjectMapper(RestObjectMapperFactory.KEY_PROVIDER_READ_OR_CONSUMER_READ)
+            .readValue(inputStream, targetType);
       } catch (MismatchedInputException e) {
         // there is no way to detect InputStream is empty, so have to catch 
the exception
         if (!isRequired) {
@@ -100,7 +101,7 @@ public class BodyProcessorCreator implements 
ParamValueProcessorCreator {
     public void setValue(RestClientRequest clientRequest, Object arg) throws 
Exception {
       try (BufferOutputStream output = new BufferOutputStream()) {
         clientRequest.putHeader(HttpHeaders.CONTENT_TYPE, 
MediaType.APPLICATION_JSON);
-        RestObjectMapperFactory.getRestObjectMapper().writeValue(output, arg);
+        
RestObjectMapperFactory.getRestObjectMapper(RestObjectMapperFactory.KEY_CONSUMER_WRITE).writeValue(output,
 arg);
         if (arg != null) {
           clientRequest.write(output.getBuffer());
         }
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 7f8a776..1688349 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
@@ -64,7 +64,8 @@ public class CookieProcessorCreator implements 
ParamValueProcessorCreator {
 
     @Override
     public void setValue(RestClientRequest clientRequest, Object arg) throws 
Exception {
-      clientRequest.addCookie(paramPath, 
RestObjectMapperFactory.getRestObjectMapper().convertToString(arg));
+      clientRequest.addCookie(paramPath,
+          
RestObjectMapperFactory.getRestObjectMapper(RestObjectMapperFactory.KEY_CONSUMER_WRITE).convertToString(arg));
     }
 
     @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 43b4582..44fa146 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
@@ -74,7 +74,8 @@ public class HeaderProcessorCreator implements 
ParamValueProcessorCreator {
         LOGGER.debug("Header arg is null, will not be set into clientRequest. 
paramPath = [{}]", paramPath);
         return;
       }
-      clientRequest.putHeader(paramPath, 
RestObjectMapperFactory.getRestObjectMapper().convertToString(arg));
+      clientRequest.putHeader(paramPath,
+          
RestObjectMapperFactory.getRestObjectMapper(RestObjectMapperFactory.KEY_CONSUMER_WRITE).convertToString(arg));
     }
 
     @Override
diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/ParamValueProcessor.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/ParamValueProcessor.java
index e38f7dc..8753b40 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/ParamValueProcessor.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/param/ParamValueProcessor.java
@@ -30,7 +30,8 @@ public interface ParamValueProcessor {
   void setValue(RestClientRequest clientRequest, Object arg) throws Exception;
 
   default Object convertValue(Object value, JavaType targetType) {
-    return RestObjectMapperFactory.getRestObjectMapper().convertValue(value, 
targetType);
+    return 
RestObjectMapperFactory.getRestObjectMapper(RestObjectMapperFactory.KEY_PROVIDER_READ_OR_CONSUMER_READ)
+        .convertValue(value, targetType);
   }
 
   String getParameterPath();
diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceJsonProcessor.java
 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceJsonProcessor.java
index 817aef0..4f57553 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceJsonProcessor.java
+++ 
b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceJsonProcessor.java
@@ -35,12 +35,13 @@ public class ProduceJsonProcessor implements 
ProduceProcessor {
 
   @Override
   public void doEncodeResponse(OutputStream output, Object result) throws 
Exception {
-    RestObjectMapperFactory.getRestObjectMapper().writeValue(output, result);
+    
RestObjectMapperFactory.getRestObjectMapper(RestObjectMapperFactory.KEY_PROVIDER_WRITE).writeValue(output,
 result);
   }
 
   @Override
   public Object doDecodeResponse(InputStream input, JavaType type) throws 
Exception {
-    return RestObjectMapperFactory.getRestObjectMapper().readValue(input, 
type);
+    return 
RestObjectMapperFactory.getRestObjectMapper(RestObjectMapperFactory.KEY_PROVIDER_READ_OR_CONSUMER_READ)
+        .readValue(input, type);
   }
 
   @Override
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 71407ef..2bd2a74 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
@@ -24,6 +24,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.common.rest.codec.RestObjectMapperFactory;
 import org.apache.servicecomb.core.Const;
 import org.apache.servicecomb.core.CseContext;
@@ -34,6 +35,7 @@ import org.apache.servicecomb.demo.TestMgr;
 import org.apache.servicecomb.demo.compute.Person;
 import org.apache.servicecomb.demo.jaxrs.client.beanParam.BeanParamPojoClient;
 import 
org.apache.servicecomb.demo.jaxrs.client.beanParam.BeanParamRestTemplateClient;
+import 
org.apache.servicecomb.demo.jaxrs.client.pojoDefault.DefaultModelServiceClient;
 import org.apache.servicecomb.demo.validator.Student;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
 import org.apache.servicecomb.foundation.common.utils.Log4jUtils;
@@ -61,7 +63,11 @@ public class JaxrsClient {
   public static void init() throws Exception {
     Log4jUtils.init();
     BeanUtils.init();
-    RestObjectMapperFactory.setDefaultRestObjectMapper(new 
RestObjectMapperWithStringMapper());
+    RestObjectMapperFactory
+        .setCustomMapper(RestObjectMapperFactory.KEY_CONSUMER_WRITE, new 
RestObjectMapperWithStringMapper());
+    
RestObjectMapperFactory.setCustomMapper(RestObjectMapperFactory.KEY_PROVIDER_WRITE,
 new RestObjectMapper());
+    
RestObjectMapperFactory.setCustomMapper(RestObjectMapperFactory.KEY_PROVIDER_READ_OR_CONSUMER_READ,
+        new RestObjectMapperWithStringMapper());
   }
 
   public static void run() throws Exception {
@@ -78,6 +84,7 @@ public class JaxrsClient {
     beanParamPojoClient.testAll();
     BeanParamRestTemplateClient beanParamRestTemplateClient = new 
BeanParamRestTemplateClient();
     beanParamRestTemplateClient.testAll();
+    DefaultModelServiceClient.run();
   }
 
   private static void testCompute(RestTemplate template) throws Exception {
diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestObjectMapperFactory.java
 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/pojoDefault/DefaultModel.java
similarity index 63%
copy from 
common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestObjectMapperFactory.java
copy to 
demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/pojoDefault/DefaultModel.java
index 188d9de..1c5d64e 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestObjectMapperFactory.java
+++ 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/pojoDefault/DefaultModel.java
@@ -15,19 +15,16 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.common.rest.codec;
+package org.apache.servicecomb.demo.jaxrs.client.pojoDefault;
 
-/**
- * Manage RestObjectMapper instances. Give users an option to specify custom 
mappers.
- */
-public class RestObjectMapperFactory {
-  private static AbstractRestObjectMapper defaultMapper = new 
RestObjectMapper();
+public class DefaultModel {
+  private int index;
 
-  public static AbstractRestObjectMapper getRestObjectMapper() {
-    return defaultMapper;
+  public int getIndex() {
+    return index;
   }
 
-  public static void setDefaultRestObjectMapper(AbstractRestObjectMapper 
customMapper) {
-    defaultMapper = customMapper;
+  public void setIndex(int index) {
+    this.index = index;
   }
 }
diff --git 
a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/pojoDefault/DefaultModelServiceClient.java
 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/pojoDefault/DefaultModelServiceClient.java
new file mode 100644
index 0000000..f6dedf1
--- /dev/null
+++ 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/pojoDefault/DefaultModelServiceClient.java
@@ -0,0 +1,46 @@
+/*
+ * 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.client.pojoDefault;
+
+import org.apache.servicecomb.core.CseContext;
+import org.apache.servicecomb.demo.TestMgr;
+import 
org.apache.servicecomb.demo.jaxrs.server.pojoDefault.DefaultResponseModel;
+import org.apache.servicecomb.provider.springmvc.reference.RestTemplateBuilder;
+import org.springframework.web.client.RestTemplate;
+
+public class DefaultModelServiceClient {
+  private static RestTemplate template = RestTemplateBuilder.create();
+
+  private static String urlPrefix = "cse://jaxrs/DefaultModelService";
+
+  public static void run() {
+    // highway do not support this feature
+    
CseContext.getInstance().getConsumerProviderManager().setTransport("jaxrs", 
"rest");
+    testDefaultModelService();
+  }
+
+  private static void testDefaultModelService() {
+    DefaultModel model = new DefaultModel();
+    model.setIndex(400);
+    DefaultResponseModel result = template.postForObject(urlPrefix + "/model", 
model, DefaultResponseModel.class);
+    TestMgr.check(result.getAge(), 200);
+    TestMgr.check(result.getIndex(), 400);
+    TestMgr.check(result.getName(), "World");
+    TestMgr.check(result.getDesc(), null);
+  }
+}
diff --git 
a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultResponseModel.java
 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultResponseModel.java
new file mode 100644
index 0000000..6c4350a
--- /dev/null
+++ 
b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultResponseModel.java
@@ -0,0 +1,76 @@
+/*
+ * 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.pojoDefault;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.Null;
+
+public class DefaultResponseModel {
+  @Min(20)
+  @Max(2000)
+  @Null
+  private Integer age = 200;
+
+  @Min(2)
+  @Max(30)
+  @Null
+  private String name = "World";
+
+  private int index;
+
+  private String desc = "Hello";
+
+  public Integer getAge() {
+    return age;
+  }
+
+  public void setAge(Integer age) {
+    this.age = age;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+
+  public int getIndex() {
+    return index;
+  }
+
+  public void setIndex(int index) {
+    this.index = index;
+  }
+
+  public String getDesc() {
+    return desc;
+  }
+
+  public void setDesc(String desc) {
+    this.desc = desc;
+  }
+
+  @Override
+  public String toString() {
+    return "index=" + index + ";name=" + name + ";age=" + age;
+  }
+}
diff --git 
a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/JaxrsServer.java
 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/JaxrsServer.java
index bf5eba5..f661720 100644
--- 
a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/JaxrsServer.java
+++ 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/JaxrsServer.java
@@ -17,6 +17,7 @@
 
 package org.apache.servicecomb.demo.jaxrs.server;
 
+import org.apache.servicecomb.common.rest.codec.RestObjectMapper;
 import org.apache.servicecomb.common.rest.codec.RestObjectMapperFactory;
 import org.apache.servicecomb.demo.RestObjectMapperWithStringMapper;
 import org.apache.servicecomb.foundation.common.utils.BeanUtils;
@@ -26,6 +27,10 @@ public class JaxrsServer {
   public static void main(String[] args) throws Exception {
     Log4jUtils.init();
     BeanUtils.init();
-    RestObjectMapperFactory.setDefaultRestObjectMapper(new 
RestObjectMapperWithStringMapper());
+    RestObjectMapperFactory
+        .setCustomMapper(RestObjectMapperFactory.KEY_CONSUMER_WRITE, new 
RestObjectMapperWithStringMapper());
+    
RestObjectMapperFactory.setCustomMapper(RestObjectMapperFactory.KEY_PROVIDER_WRITE,
 new RestObjectMapper());
+    
RestObjectMapperFactory.setCustomMapper(RestObjectMapperFactory.KEY_PROVIDER_READ_OR_CONSUMER_READ,
+        new RestObjectMapperWithStringMapper());
   }
 }
diff --git 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestObjectMapperFactory.java
 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultModelService.java
similarity index 57%
copy from 
common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestObjectMapperFactory.java
copy to 
demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultModelService.java
index 188d9de..7296a09 100644
--- 
a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/RestObjectMapperFactory.java
+++ 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultModelService.java
@@ -15,19 +15,24 @@
  * limitations under the License.
  */
 
-package org.apache.servicecomb.common.rest.codec;
+package org.apache.servicecomb.demo.jaxrs.server.pojoDefault;
 
-/**
- * Manage RestObjectMapper instances. Give users an option to specify custom 
mappers.
- */
-public class RestObjectMapperFactory {
-  private static AbstractRestObjectMapper defaultMapper = new 
RestObjectMapper();
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
 
-  public static AbstractRestObjectMapper getRestObjectMapper() {
-    return defaultMapper;
-  }
+import org.apache.servicecomb.provider.rest.common.RestSchema;
 
-  public static void setDefaultRestObjectMapper(AbstractRestObjectMapper 
customMapper) {
-    defaultMapper = customMapper;
+@RestSchema(schemaId = "DefaultModelService")
+@Path("DefaultModelService")
+public class DefaultModelService {
+  @Path("/model")
+  @POST
+  public DefaultResponseModel errorCode(DefaultRequestModel request) {
+    DefaultResponseModel model = new DefaultResponseModel();
+    model.setIndex(request.getIndex());
+    model.setAge(request.getAge());
+    model.setName(request.getName());
+    model.setDesc(null);
+    return model;
   }
 }
diff --git 
a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultRequestModel.java
 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultRequestModel.java
new file mode 100644
index 0000000..0cc5357
--- /dev/null
+++ 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultRequestModel.java
@@ -0,0 +1,76 @@
+/*
+ * 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.pojoDefault;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.Null;
+
+public class DefaultRequestModel {
+  @Min(20)
+  @Max(2000)
+  @Null
+  private Integer age = 200;
+
+  @Min(2)
+  @Max(30)
+  @Null
+  private String name = "World";
+
+  private int index;
+
+  private String desc;
+
+  public Integer getAge() {
+    return age;
+  }
+
+  public void setAge(Integer age) {
+    this.age = age;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+
+  public int getIndex() {
+    return index;
+  }
+
+  public void setIndex(int index) {
+    this.index = index;
+  }
+
+  public String getDesc() {
+    return desc;
+  }
+
+  public void setDesc(String desc) {
+    this.desc = desc;
+  }
+
+  @Override
+  public String toString() {
+    return "index=" + index + ";name=" + name + ";age=" + age;
+  }
+}
diff --git 
a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultResponseModel.java
 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultResponseModel.java
new file mode 100644
index 0000000..bf4288a
--- /dev/null
+++ 
b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/pojoDefault/DefaultResponseModel.java
@@ -0,0 +1,76 @@
+/*
+ * 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.pojoDefault;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.Null;
+
+public class DefaultResponseModel {
+  @Min(20)
+  @Max(2000)
+  @Null
+  private Integer age = 200;
+
+  @Min(2)
+  @Max(30)
+  @Null
+  private String name = "World";
+
+  private int index;
+
+  private String desc;
+
+  public Integer getAge() {
+    return age;
+  }
+
+  public void setAge(Integer age) {
+    this.age = age;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public void setName(String name) {
+    this.name = name;
+  }
+
+
+  public int getIndex() {
+    return index;
+  }
+
+  public void setIndex(int index) {
+    this.index = index;
+  }
+
+  public String getDesc() {
+    return desc;
+  }
+
+  public void setDesc(String desc) {
+    this.desc = desc;
+  }
+
+  @Override
+  public String toString() {
+    return "index=" + index + ";name=" + name + ";age=" + age;
+  }
+}
diff --git 
a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/RestObjectMapperWithStringMapper.java
 
b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/RestObjectMapperWithStringMapper.java
index d90160c..6438069 100644
--- 
a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/RestObjectMapperWithStringMapper.java
+++ 
b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/RestObjectMapperWithStringMapper.java
@@ -24,6 +24,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import com.fasterxml.jackson.databind.JavaType;
 
 /**
@@ -50,6 +51,7 @@ public class RestObjectMapperWithStringMapper extends 
RestObjectMapper {
 
   public RestObjectMapperWithStringMapper() {
     super();
+    setSerializationInclusion(Include.NON_NULL);
   }
 
   @Override

Reply via email to