You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by li...@apache.org on 2020/04/13 08:27:57 UTC

[servicecomb-java-chassis] 02/04: [SCB-1828] Support @JsonView : add ut

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/servicecomb-java-chassis.git

commit 3767e7f7ef167fa9654c1eab2e9ff47cf2357f0d
Author: heyile <25...@qq.com>
AuthorDate: Fri Apr 3 01:07:40 2020 +0800

    [SCB-1828] Support @JsonView : add ut
---
 .../codec/produce/ProduceProcessorManager.java     |   2 +-
 .../codec/produce/TestProduceJsonProcessor.java    |  16 +-
 .../produce/TestProduceTextPlainProcessor.java     |  11 +
 .../rest/definition/TestRestOperationMeta.java     |  49 +++-
 .../servicecomb/demo/CodeFirstRestTemplate.java    |   5 +-
 .../foundation/common/utils/RestObjectMapper.java  |   3 +
 .../servicecomb/it/schema/PersonViewModel.java     | 128 +++++++++++
 .../org/apache/servicecomb/it/ConsumerMain.java    |   4 +
 .../servicecomb/it/testcase/TestJsonView.java      | 251 +++++++++++++++++++++
 .../servicecomb/it/schema/JsonViewJaxrsSchema.java |  96 ++++++++
 .../servicecomb/it/schema/JsonViewPojoSchema.java  |  69 ++++++
 .../it/schema/JsonViewSpringmvcSchema.java         |  79 +++++++
 12 files changed, 703 insertions(+), 10 deletions(-)

diff --git a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceProcessorManager.java b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceProcessorManager.java
index 911b777..b7ad3dc 100644
--- a/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceProcessorManager.java
+++ b/common/common-rest/src/main/java/org/apache/servicecomb/common/rest/codec/produce/ProduceProcessorManager.java
@@ -53,7 +53,7 @@ public final class ProduceProcessorManager extends RegisterManager<String, Map<S
     produceProcessor.forEach(processor -> {
       Map<String, ProduceProcessor> prodProcessorMap = getObjMap()
           .computeIfAbsent(processor.getName(), key -> new HashMap<>());
-      prodProcessorMap.put(processor.getSerializationView(), processor);
+      prodProcessorMap.putIfAbsent(processor.getSerializationView(), processor);
     });
     jsonProcessorMap = ensureFindValue(MediaType.APPLICATION_JSON);
     plainProcessorMap = ensureFindValue(MediaType.TEXT_PLAIN);
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceJsonProcessor.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceJsonProcessor.java
index 2a29a2e..f5337f0 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceJsonProcessor.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceJsonProcessor.java
@@ -17,6 +17,8 @@
 
 package org.apache.servicecomb.common.rest.codec.produce;
 
+import static org.apache.servicecomb.common.rest.codec.produce.ProduceProcessorManager.DEFAULT_SERIAL_CLASS;
+
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.nio.charset.StandardCharsets;
@@ -32,7 +34,7 @@ import io.vertx.core.buffer.Buffer;
 
 public class TestProduceJsonProcessor {
   ProduceProcessor pp = ProduceProcessorManager.INSTANCE.getJsonProcessorMap()
-      .get(ProduceProcessorManager.DEFAULT_SERIAL_CLASS);
+      .get(DEFAULT_SERIAL_CLASS);
 
   JavaType stringType = TypeFactory.defaultInstance().constructType(String.class);
 
@@ -59,7 +61,6 @@ public class TestProduceJsonProcessor {
     } catch (Exception e) {
       Assert.assertTrue(e instanceof MismatchedInputException);
     }
-
   }
 
   @Test
@@ -87,4 +88,15 @@ public class TestProduceJsonProcessor {
     os.close();
     is.close();
   }
+
+  @Test
+  public void testSetSerializationView() {
+    Assert.assertEquals(DEFAULT_SERIAL_CLASS, pp.getSerializationView());
+
+    pp.setSerializationView(null);
+    Assert.assertEquals(DEFAULT_SERIAL_CLASS, pp.getSerializationView());
+
+    pp.setSerializationView(Object.class);
+    Assert.assertEquals(Object.class.getCanonicalName(), pp.getSerializationView());
+  }
 }
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceTextPlainProcessor.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceTextPlainProcessor.java
index 2563103..3709f91 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceTextPlainProcessor.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/codec/produce/TestProduceTextPlainProcessor.java
@@ -82,4 +82,15 @@ public class TestProduceTextPlainProcessor {
     os.close();
     is.close();
   }
+
+  @Test
+  public void testSetSerializationView() {
+    Assert.assertEquals(DEFAULT_SERIAL_CLASS, pp.getSerializationView());
+
+    pp.setSerializationView(null);
+    Assert.assertEquals(DEFAULT_SERIAL_CLASS, pp.getSerializationView());
+
+    pp.setSerializationView(Object.class);
+    Assert.assertEquals(DEFAULT_SERIAL_CLASS, pp.getSerializationView());
+  }
 }
diff --git a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java
index f959b78..79ca0bb 100644
--- a/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java
+++ b/common/common-rest/src/test/java/org/apache/servicecomb/common/rest/definition/TestRestOperationMeta.java
@@ -22,6 +22,7 @@ import static org.hamcrest.core.Is.is;
 import static org.junit.Assert.assertThat;
 
 import java.io.File;
+import java.lang.annotation.Annotation;
 import java.util.Arrays;
 
 import javax.ws.rs.FormParam;
@@ -43,6 +44,8 @@ import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import com.fasterxml.jackson.annotation.JsonView;
+
 import io.swagger.models.Swagger;
 import mockit.Expectations;
 import mockit.Mocked;
@@ -215,33 +218,67 @@ public class TestRestOperationMeta {
   }
 
   @Test
-  public void testEnsureFindProduceProcessorRequest(@Mocked HttpServletRequestEx requestEx) {
+  public void testEnsureFindProduceProcessorRequest(@Mocked HttpServletRequestEx requestEx,
+      @Mocked JsonView annotation) {
     findOperation("emptyProduces");
     new Expectations() {
       {
         requestEx.getHeader(HttpHeaders.ACCEPT);
         result = null;
+        annotation.value();
+        result = Object.class;
       }
     };
-
     Assert.assertSame(ProduceProcessorManager.INSTANCE.getJsonProcessorMap().get(DEFAULT_SERIAL_CLASS),
         operationMeta.ensureFindProduceProcessor(requestEx));
+
+    ProduceProcessor actualProcessor = operationMeta
+        .ensureFindProduceProcessor(requestEx.getHeader(HttpHeaders.ACCEPT), new Annotation[] {annotation});
+    ProduceProcessor expectProcessor = ProduceProcessorManager.INSTANCE.getJsonProcessorMap()
+        .get(Object.class.getCanonicalName());
+    Assert.assertSame(expectProcessor, actualProcessor);
+    Assert.assertEquals(expectProcessor.getSerializationView(), Object.class.getCanonicalName());
   }
 
   @Test
-  public void testEnsureFindProduceProcessorAcceptFound() {
+  public void testEnsureFindProduceProcessorAcceptFound(@Mocked JsonView annotation) {
     findOperation("textCharJsonChar");
-
+    new Expectations() {
+      {
+        annotation.value();
+        result = Object.class;
+      }
+    };
     Assert.assertSame(ProduceProcessorManager.INSTANCE.getJsonProcessorMap().get(DEFAULT_SERIAL_CLASS),
         operationMeta.ensureFindProduceProcessor("text/plain;q=0.7;charset=utf-8,application/json;q=0.8"));
+
+    ProduceProcessor actualProcessor = operationMeta
+        .ensureFindProduceProcessor("text/plain;q=0.7;charset=utf-8,application/json;q=0.8",
+            new Annotation[] {annotation});
+    ProduceProcessor expectProcessor = ProduceProcessorManager.INSTANCE.getJsonProcessorMap()
+        .get(Object.class.getCanonicalName());
+    Assert.assertSame(expectProcessor, actualProcessor);
+    Assert.assertEquals(expectProcessor.getSerializationView(), Object.class.getCanonicalName());
   }
 
   @Test
-  public void testEnsureFindProduceProcessorWithDownload() {
+  public void testEnsureFindProduceProcessorWithDownload(@Mocked JsonView annotation) {
     findOperation("download");
-
+    new Expectations() {
+      {
+        annotation.value();
+        result = Object.class;
+      }
+    };
     Assert.assertSame(ProduceProcessorManager.INSTANCE.getJsonProcessorMap().get(DEFAULT_SERIAL_CLASS),
         operationMeta.ensureFindProduceProcessor("text/plain"));
+
+    ProduceProcessor actualProcessor = operationMeta
+        .ensureFindProduceProcessor("text/plain", new Annotation[] {annotation});
+    ProduceProcessor expectProcessor = ProduceProcessorManager.INSTANCE.getJsonProcessorMap()
+        .get(Object.class.getCanonicalName());
+    Assert.assertSame(expectProcessor, actualProcessor);
+    Assert.assertEquals(expectProcessor.getSerializationView(), Object.class.getCanonicalName());
   }
 
   @Test
diff --git a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java
index 087d518..db0f694 100644
--- a/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java
+++ b/demo/demo-schema/src/main/java/org/apache/servicecomb/demo/CodeFirstRestTemplate.java
@@ -17,6 +17,8 @@
 
 package org.apache.servicecomb.demo;
 
+import static org.apache.servicecomb.common.rest.codec.produce.ProduceProcessorManager.DEFAULT_SERIAL_CLASS;
+
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
@@ -146,7 +148,8 @@ public class CodeFirstRestTemplate {
         HttpMethod.POST,
         requestEntity,
         JAXBPerson.class);
-    TestMgr.check(-1, ProduceProcessorManager.INSTANCE.ensureFindValue(MediaType.APPLICATION_XML_VALUE).getOrder());
+    TestMgr.check(-1, ProduceProcessorManager.INSTANCE.ensureFindValue(MediaType.APPLICATION_XML_VALUE)
+        .get(DEFAULT_SERIAL_CLASS).getOrder());
     TestMgr.check(person, resEntity.getBody());
   }
 
diff --git a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/RestObjectMapper.java b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/RestObjectMapper.java
index 7a57691..161c12e 100644
--- a/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/RestObjectMapper.java
+++ b/foundations/foundation-common/src/main/java/org/apache/servicecomb/foundation/common/utils/RestObjectMapper.java
@@ -26,6 +26,7 @@ import com.fasterxml.jackson.core.JsonParser.Feature;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.MapperFeature;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.module.SimpleModule;
@@ -68,6 +69,8 @@ public class RestObjectMapper extends AbstractRestObjectMapper {
     // Developers can use validation api to do more checks.
     disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
     disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
+    // no view annotations shouldn't be included in JSON
+    disable(MapperFeature.DEFAULT_VIEW_INCLUSION);
     enable(DeserializationFeature.UNWRAP_SINGLE_VALUE_ARRAYS);
     enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
 
diff --git a/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/schema/PersonViewModel.java b/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/schema/PersonViewModel.java
new file mode 100644
index 0000000..ea086d7
--- /dev/null
+++ b/integration-tests/it-common/src/main/java/org/apache/servicecomb/it/schema/PersonViewModel.java
@@ -0,0 +1,128 @@
+/*
+ * 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.it.schema;
+
+import java.util.Objects;
+
+import com.fasterxml.jackson.annotation.JsonView;
+
+public class PersonViewModel {
+  public interface Summary {
+  }
+
+  public interface SummaryWithDetails extends Summary {
+  }
+
+  @JsonView(Summary.class)
+  private String name;
+
+  @JsonView(SummaryWithDetails.class)
+  private int age;
+
+  @JsonView(Summary.class)
+  private String emails;
+
+  @JsonView(SummaryWithDetails.class)
+  private String telephone;
+
+  private double rate;
+
+  public String getName() {
+    return name;
+  }
+
+  public PersonViewModel setName(String name) {
+    this.name = name;
+    return this;
+  }
+
+  public int getAge() {
+    return age;
+  }
+
+  public PersonViewModel setAge(int age) {
+    this.age = age;
+    return this;
+  }
+
+  public String getEmails() {
+    return emails;
+  }
+
+  public PersonViewModel setEmails(String emails) {
+    this.emails = emails;
+    return this;
+  }
+
+  public String getTelephone() {
+    return telephone;
+  }
+
+  public PersonViewModel setTelephone(String telephone) {
+    this.telephone = telephone;
+    return this;
+  }
+
+  public double getRate() {
+    return rate;
+  }
+
+  public PersonViewModel setRate(double rate) {
+    this.rate = rate;
+    return this;
+  }
+
+  public static PersonViewModel generatePersonViewModel() {
+    return new PersonViewModel().setAge(12)
+        .setEmails("xxx@servicecomb.com")
+        .setName("servicecomb")
+        .setRate(99.9)
+        .setTelephone("xxx10--xx");
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    PersonViewModel that = (PersonViewModel) o;
+    return age == that.age &&
+        Double.compare(that.rate, rate) == 0 &&
+        Objects.equals(name, that.name) &&
+        Objects.equals(emails, that.emails) &&
+        Objects.equals(telephone, that.telephone);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(name, age, emails, telephone, rate);
+  }
+
+  @Override
+  public String toString() {
+    return "PersonViewModel{" +
+        "name='" + name + '\'' +
+        ", age=" + age +
+        ", emails='" + emails + '\'' +
+        ", telephone='" + telephone + '\'' +
+        ", rate=" + rate +
+        '}';
+  }
+}
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java
index 1f1b724..eefb630 100644
--- a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/ConsumerMain.java
@@ -38,6 +38,7 @@ import org.apache.servicecomb.it.testcase.TestExceptionConvertEdge;
 import org.apache.servicecomb.it.testcase.TestGenericEdge;
 import org.apache.servicecomb.it.testcase.TestIgnoreMethod;
 import org.apache.servicecomb.it.testcase.TestIgnoreStaticMethod;
+import org.apache.servicecomb.it.testcase.TestJsonView;
 import org.apache.servicecomb.it.testcase.TestOptional;
 import org.apache.servicecomb.it.testcase.TestParamCodec;
 import org.apache.servicecomb.it.testcase.TestParamCodecEdge;
@@ -115,6 +116,9 @@ public class ConsumerMain {
     ITJUnitUtils.runWithHighwayAndRest(TestAnnotatedAttribute.class);
     ITJUnitUtils.runWithHighwayAndRest(TestMyService.class);
 
+    //only rest support Json view
+    ITJUnitUtils.runWithRest(TestJsonView.class);
+
     // only rest support default value feature
     ITJUnitUtils.runWithRest(TestDefaultValue.class);
     ITJUnitUtils.runWithRest(TestAcceptType.class);
diff --git a/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestJsonView.java b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestJsonView.java
new file mode 100644
index 0000000..af5a7a2
--- /dev/null
+++ b/integration-tests/it-consumer/src/main/java/org/apache/servicecomb/it/testcase/TestJsonView.java
@@ -0,0 +1,251 @@
+/*
+ * 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.it.testcase;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.servicecomb.it.Consumers;
+import org.apache.servicecomb.it.schema.PersonViewModel;
+import org.junit.Test;
+
+public class TestJsonView {
+  interface JsonViewRestIntf {
+    PersonViewModel jsonViewDefault();
+
+    PersonViewModel jsonViewDefaultWithSummary();
+
+    PersonViewModel jsonViewDefaultWithSummaryDetails();
+
+    PersonViewModel jsonViewProducesDefault();
+
+    PersonViewModel jsonViewProducesDefaultWithSummary();
+
+    PersonViewModel jsonViewProducesDefaultWithSummaryDetails();
+
+    String jsonViewPlainDefault();
+
+    String jsonViewPlainDefaultWithSummary();
+
+    String jsonViewPlainDefaultWithSummaryDetails();
+  }
+
+  private static Consumers<JsonViewRestIntf> consumersPojo = new Consumers<>("jsonViewPojoSchema",
+      JsonViewRestIntf.class);
+
+  private static Consumers<JsonViewRestIntf> consumersSpringmvc = new Consumers<>("jsonViewSpringmvcSchema",
+      JsonViewRestIntf.class);
+
+  private static Consumers<JsonViewRestIntf> consumersJaxrs = new Consumers<>("jsonViewJaxrsSchema",
+      JsonViewRestIntf.class);
+
+  private static final PersonViewModel EXPECT_SUMMARY_VIEW = new PersonViewModel().setName("servicecomb")
+      .setEmails("xxx@servicecomb.com");
+
+  private static final PersonViewModel EXPECT_SUMMARY_DETAILS_VIEW = new PersonViewModel().setName("servicecomb")
+      .setEmails("xxx@servicecomb.com").setAge(12).setTelephone("xxx10--xx");
+
+  private static final PersonViewModel EXPECT_NO_VIEW = PersonViewModel.generatePersonViewModel();
+
+  @Test
+  public void testJsonViewDefault() {
+    PersonViewModel restPersonViewSpringMvc = consumersSpringmvc.getSCBRestTemplate()
+        .getForObject("/jsonViewDefault", PersonViewModel.class);
+    assertEquals(EXPECT_NO_VIEW, restPersonViewSpringMvc);
+    PersonViewModel pojoPersonViewSpringMvc = consumersSpringmvc.getIntf().jsonViewDefault();
+    assertEquals(EXPECT_NO_VIEW, pojoPersonViewSpringMvc);
+
+    PersonViewModel restPersonViewJaxrs = consumersJaxrs.getSCBRestTemplate()
+        .getForObject("/jsonViewDefault", PersonViewModel.class);
+    assertEquals(EXPECT_NO_VIEW, restPersonViewJaxrs);
+    PersonViewModel pojoPersonViewJaxrs = consumersJaxrs.getIntf().jsonViewDefault();
+    assertEquals(EXPECT_NO_VIEW, pojoPersonViewJaxrs);
+
+    PersonViewModel restPersonViewPojo = consumersPojo.getSCBRestTemplate()
+        .postForObject("/jsonViewDefault", null, PersonViewModel.class);
+    assertEquals(EXPECT_NO_VIEW, restPersonViewPojo);
+    PersonViewModel pojoPersonViewPojo = consumersPojo.getIntf().jsonViewDefault();
+    assertEquals(EXPECT_NO_VIEW, pojoPersonViewPojo);
+  }
+
+  @Test
+  public void testJsonViewDefaultWithSummary() {
+    PersonViewModel restPersonViewSpringMvc = consumersSpringmvc.getSCBRestTemplate()
+        .getForObject("/jsonViewDefaultWithSummary", PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_VIEW, restPersonViewSpringMvc);
+    PersonViewModel pojoPersonViewSpringMvc = consumersSpringmvc.getIntf().jsonViewDefaultWithSummary();
+    assertEquals(EXPECT_SUMMARY_VIEW, pojoPersonViewSpringMvc);
+
+    PersonViewModel restPersonViewJaxrs = consumersJaxrs.getSCBRestTemplate()
+        .getForObject("/jsonViewDefaultWithSummary", PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_VIEW, restPersonViewJaxrs);
+    PersonViewModel pojoPersonViewJaxrs = consumersJaxrs.getIntf().jsonViewDefaultWithSummary();
+    assertEquals(EXPECT_SUMMARY_VIEW, pojoPersonViewJaxrs);
+
+    PersonViewModel restPersonViewPojo = consumersPojo.getSCBRestTemplate()
+        .postForObject("/jsonViewDefaultWithSummary", null, PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_VIEW, restPersonViewPojo);
+    PersonViewModel pojoPersonViewPojo = consumersPojo.getIntf().jsonViewDefaultWithSummary();
+    assertEquals(EXPECT_SUMMARY_VIEW, pojoPersonViewPojo);
+  }
+
+  @Test
+  public void testJsonViewDefaultWithSummaryDetails() {
+    PersonViewModel restPersonViewSpringMvc = consumersSpringmvc.getSCBRestTemplate()
+        .getForObject("/jsonViewDefaultWithSummaryDetails", PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, restPersonViewSpringMvc);
+    PersonViewModel pojoPersonViewSpringMvc = consumersSpringmvc.getIntf().jsonViewDefaultWithSummaryDetails();
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, pojoPersonViewSpringMvc);
+
+    PersonViewModel restPersonViewJaxrs = consumersJaxrs.getSCBRestTemplate()
+        .getForObject("/jsonViewDefaultWithSummaryDetails", PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, restPersonViewJaxrs);
+    PersonViewModel pojoPersonViewJaxrs = consumersJaxrs.getIntf().jsonViewDefaultWithSummaryDetails();
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, pojoPersonViewJaxrs);
+
+    PersonViewModel restPersonViewPojo = consumersPojo.getSCBRestTemplate()
+        .postForObject("/jsonViewDefaultWithSummaryDetails", null, PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, restPersonViewPojo);
+    PersonViewModel pojoPersonViewPojo = consumersPojo.getIntf().jsonViewDefaultWithSummaryDetails();
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, pojoPersonViewPojo);
+  }
+
+  @Test
+  public void testJsonViewProducesDefault() {
+    PersonViewModel restPersonViewSpringMvc = consumersSpringmvc.getSCBRestTemplate()
+        .getForObject("/jsonViewProducesDefault", PersonViewModel.class);
+    assertEquals(EXPECT_NO_VIEW, restPersonViewSpringMvc);
+    PersonViewModel pojoPersonViewSpringMvc = consumersSpringmvc.getIntf().jsonViewProducesDefault();
+    assertEquals(EXPECT_NO_VIEW, pojoPersonViewSpringMvc);
+
+    PersonViewModel restPersonViewJaxrs = consumersJaxrs.getSCBRestTemplate()
+        .getForObject("/jsonViewProducesDefault", PersonViewModel.class);
+    assertEquals(EXPECT_NO_VIEW, restPersonViewJaxrs);
+    PersonViewModel pojoPersonViewJaxrs = consumersJaxrs.getIntf().jsonViewProducesDefault();
+    assertEquals(EXPECT_NO_VIEW, pojoPersonViewJaxrs);
+
+    PersonViewModel restPersonViewPojo = consumersPojo.getSCBRestTemplate()
+        .postForObject("/jsonViewProducesDefault", null, PersonViewModel.class);
+    assertEquals(EXPECT_NO_VIEW, restPersonViewPojo);
+    PersonViewModel pojoPersonViewPojo = consumersPojo.getIntf().jsonViewProducesDefault();
+    assertEquals(EXPECT_NO_VIEW, pojoPersonViewPojo);
+  }
+
+  @Test
+  public void testJsonViewProducesDefaultWithSummary() {
+    PersonViewModel restPersonViewJaxrs = consumersJaxrs.getSCBRestTemplate()
+        .getForObject("/jsonViewProducesDefaultWithSummary", PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_VIEW, restPersonViewJaxrs);
+    PersonViewModel pojoPersonViewJaxrs = consumersJaxrs.getIntf().jsonViewProducesDefaultWithSummary();
+    assertEquals(EXPECT_SUMMARY_VIEW, pojoPersonViewJaxrs);
+
+    PersonViewModel restPersonViewSpringMvc = consumersSpringmvc.getSCBRestTemplate()
+        .getForObject("/jsonViewProducesDefaultWithSummary", PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_VIEW, restPersonViewSpringMvc);
+    PersonViewModel pojoPersonViewSpringMvc = consumersSpringmvc.getIntf().jsonViewProducesDefaultWithSummary();
+    assertEquals(EXPECT_SUMMARY_VIEW, pojoPersonViewSpringMvc);
+
+    PersonViewModel restPersonViewPojo = consumersPojo.getSCBRestTemplate()
+        .postForObject("/jsonViewProducesDefaultWithSummary", null, PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_VIEW, restPersonViewPojo);
+    PersonViewModel pojoPersonViewPojo = consumersPojo.getIntf().jsonViewProducesDefaultWithSummary();
+    assertEquals(EXPECT_SUMMARY_VIEW, pojoPersonViewPojo);
+  }
+
+  @Test
+  public void testJsonViewProducesDefaultWithSummaryDetails() {
+    PersonViewModel restPersonViewSpringMvc = consumersSpringmvc.getSCBRestTemplate()
+        .getForObject("/jsonViewProducesDefaultWithSummaryDetails", PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, restPersonViewSpringMvc);
+    PersonViewModel pojoPersonViewSpringMvc = consumersSpringmvc.getIntf().jsonViewProducesDefaultWithSummaryDetails();
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, pojoPersonViewSpringMvc);
+
+    PersonViewModel restPersonViewJaxrs = consumersJaxrs.getSCBRestTemplate()
+        .getForObject("/jsonViewProducesDefaultWithSummaryDetails", PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, restPersonViewJaxrs);
+    PersonViewModel pojoPersonViewJaxrs = consumersJaxrs.getIntf().jsonViewProducesDefaultWithSummaryDetails();
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, pojoPersonViewJaxrs);
+
+    PersonViewModel restPersonViewPojo = consumersPojo.getSCBRestTemplate()
+        .postForObject("/jsonViewProducesDefaultWithSummaryDetails", null, PersonViewModel.class);
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, restPersonViewPojo);
+    PersonViewModel pojoPersonViewPojo = consumersPojo.getIntf().jsonViewProducesDefaultWithSummaryDetails();
+    assertEquals(EXPECT_SUMMARY_DETAILS_VIEW, pojoPersonViewPojo);
+  }
+
+  @Test
+  public void testJsonViewPlainDefault() {
+    String restPersonViewSpringMvc = consumersSpringmvc.getSCBRestTemplate()
+        .getForObject("/jsonViewPlainDefault", String.class);
+    assertEquals(EXPECT_NO_VIEW.toString(), restPersonViewSpringMvc);
+    String pojoPersonViewSpringMvc = consumersSpringmvc.getIntf().jsonViewPlainDefault();
+    assertEquals(EXPECT_NO_VIEW.toString(), pojoPersonViewSpringMvc);
+
+    String restPersonViewJaxrs = consumersJaxrs.getSCBRestTemplate()
+        .getForObject("/jsonViewPlainDefault", String.class);
+    assertEquals(EXPECT_NO_VIEW.toString(), restPersonViewJaxrs);
+    String pojoPersonViewJaxrs = consumersJaxrs.getIntf().jsonViewPlainDefault();
+    assertEquals(EXPECT_NO_VIEW.toString(), pojoPersonViewJaxrs);
+
+    String restPersonViewPojo = consumersPojo.getSCBRestTemplate()
+        .postForObject("/jsonViewPlainDefault", null, String.class);
+    assertEquals(EXPECT_NO_VIEW.toString(), restPersonViewPojo);
+    String pojoPersonViewPojo = consumersPojo.getIntf().jsonViewPlainDefault();
+    assertEquals(EXPECT_NO_VIEW.toString(), pojoPersonViewPojo);
+  }
+
+  @Test
+  public void testJsonViewPlainDefaultWithSummary() {
+    String restPersonViewSpringMvc = consumersSpringmvc.getSCBRestTemplate()
+        .getForObject("/jsonViewPlainDefaultWithSummary", String.class);
+    assertEquals(EXPECT_NO_VIEW.toString(), restPersonViewSpringMvc);
+    String pojoPersonViewSpringMvc = consumersSpringmvc.getIntf().jsonViewPlainDefaultWithSummary();
+    assertEquals(EXPECT_NO_VIEW.toString(), pojoPersonViewSpringMvc);
+
+    String restPersonViewJaxrs = consumersJaxrs.getSCBRestTemplate()
+        .getForObject("/jsonViewPlainDefaultWithSummary", String.class);
+    assertEquals(EXPECT_NO_VIEW.toString(), restPersonViewJaxrs);
+    String pojoPersonViewJaxrs = consumersJaxrs.getIntf().jsonViewPlainDefaultWithSummary();
+    assertEquals(EXPECT_NO_VIEW.toString(), pojoPersonViewJaxrs);
+
+    String restConsumersPojo = consumersPojo.getSCBRestTemplate()
+        .postForObject("/jsonViewPlainDefaultWithSummary", null, String.class);
+    assertEquals(EXPECT_NO_VIEW.toString(), restConsumersPojo);
+    String pojoConsumersPojo = consumersPojo.getIntf().jsonViewPlainDefaultWithSummary();
+    assertEquals(EXPECT_NO_VIEW.toString(), pojoConsumersPojo);
+  }
+
+  @Test
+  public void testJsonViewPlainDefaultWithSummaryDetails() {
+    String restPersonViewSpringMvc = consumersSpringmvc.getSCBRestTemplate()
+        .getForObject("/jsonViewPlainDefaultWithSummaryDetails", String.class);
+    assertEquals(EXPECT_NO_VIEW.toString(), restPersonViewSpringMvc);
+    String pojoPersonViewSpringMvc = consumersSpringmvc.getIntf().jsonViewPlainDefaultWithSummaryDetails();
+    assertEquals(EXPECT_NO_VIEW.toString(), pojoPersonViewSpringMvc);
+
+    String restPersonViewJaxrs = consumersJaxrs.getSCBRestTemplate()
+        .getForObject("/jsonViewPlainDefaultWithSummaryDetails", String.class);
+    assertEquals(EXPECT_NO_VIEW.toString(), restPersonViewJaxrs);
+    String pojoPersonViewJaxrs = consumersJaxrs.getIntf().jsonViewPlainDefaultWithSummaryDetails();
+    assertEquals(EXPECT_NO_VIEW.toString(), pojoPersonViewJaxrs);
+
+    String restConsumersPojo = consumersPojo.getSCBRestTemplate()
+        .postForObject("/jsonViewPlainDefaultWithSummaryDetails", null, String.class);
+    assertEquals(EXPECT_NO_VIEW.toString(), restConsumersPojo);
+    String pojoConsumersPojo = consumersPojo.getIntf().jsonViewPlainDefaultWithSummaryDetails();
+    assertEquals(EXPECT_NO_VIEW.toString(), pojoConsumersPojo);
+  }
+}
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/JsonViewJaxrsSchema.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/JsonViewJaxrsSchema.java
new file mode 100644
index 0000000..05c6ffe
--- /dev/null
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/JsonViewJaxrsSchema.java
@@ -0,0 +1,96 @@
+/*
+ * 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.it.schema;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+
+import com.fasterxml.jackson.annotation.JsonView;
+
+@RestSchema(schemaId = "jsonViewJaxrsSchema")
+@Path("/v1/jsonViewJaxrsSchema")
+public class JsonViewJaxrsSchema {
+
+  @GET
+  @Path("jsonViewDefault")
+  public PersonViewModel jsonViewDefault() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GET
+  @Path("jsonViewDefaultWithSummary")
+  @JsonView(PersonViewModel.Summary.class)
+  public PersonViewModel jsonViewDefaultWithSummary() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GET
+  @Path("jsonViewDefaultWithSummaryDetails")
+  @JsonView(PersonViewModel.SummaryWithDetails.class)
+  public PersonViewModel jsonViewDefaultWithSummaryDetails() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GET
+  @Path("jsonViewProducesDefault")
+  @Produces("application/json")
+  public PersonViewModel jsonViewProducesDefault() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GET
+  @Path("jsonViewProducesDefaultWithSummary")
+  @Produces("application/json")
+  @JsonView(PersonViewModel.Summary.class)
+  public PersonViewModel jsonViewProducesDefaultWithSummary() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GET
+  @Path("jsonViewProducesDefaultWithSummaryDetails")
+  @Produces("application/json")
+  @JsonView(PersonViewModel.SummaryWithDetails.class)
+  public PersonViewModel jsonViewProducesDefaultWithSummaryDetails() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GET
+  @Path("jsonViewPlainDefault")
+  @Produces("text/plain")
+  public String jsonViewPlainDefault() {
+    return PersonViewModel.generatePersonViewModel().toString();
+  }
+
+  @GET
+  @Path("jsonViewPlainDefaultWithSummary")
+  @Produces("text/plain")
+  @JsonView(PersonViewModel.Summary.class)
+  public String jsonViewPlainDefaultWithSummary() {
+    return PersonViewModel.generatePersonViewModel().toString();
+  }
+
+  @GET
+  @Path("jsonViewPlainDefaultWithSummaryDetails")
+  @Produces("text/plain")
+  @JsonView(PersonViewModel.SummaryWithDetails.class)
+  public String jsonViewPlainDefaultWithSummaryDetails() {
+    return PersonViewModel.generatePersonViewModel().toString();
+  }
+}
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/JsonViewPojoSchema.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/JsonViewPojoSchema.java
new file mode 100644
index 0000000..b778905
--- /dev/null
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/JsonViewPojoSchema.java
@@ -0,0 +1,69 @@
+/*
+ * 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.it.schema;
+
+import org.apache.servicecomb.provider.pojo.RpcSchema;
+
+import com.fasterxml.jackson.annotation.JsonView;
+
+import io.swagger.annotations.SwaggerDefinition;
+
+@RpcSchema(schemaId = "jsonViewPojoSchema")
+@SwaggerDefinition(basePath = "/v1/jsonViewPojoSchema")
+public class JsonViewPojoSchema {
+  public PersonViewModel jsonViewDefault() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @JsonView(PersonViewModel.Summary.class)
+  public PersonViewModel jsonViewDefaultWithSummary() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @JsonView(PersonViewModel.SummaryWithDetails.class)
+  public PersonViewModel jsonViewDefaultWithSummaryDetails() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  public PersonViewModel jsonViewProducesDefault() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @JsonView(PersonViewModel.Summary.class)
+  public PersonViewModel jsonViewProducesDefaultWithSummary() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @JsonView(PersonViewModel.SummaryWithDetails.class)
+  public PersonViewModel jsonViewProducesDefaultWithSummaryDetails() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  public String jsonViewPlainDefault() {
+    return PersonViewModel.generatePersonViewModel().toString();
+  }
+
+  @JsonView(PersonViewModel.Summary.class)
+  public String jsonViewPlainDefaultWithSummary() {
+    return PersonViewModel.generatePersonViewModel().toString();
+  }
+
+  @JsonView(PersonViewModel.SummaryWithDetails.class)
+  public String jsonViewPlainDefaultWithSummaryDetails() {
+    return PersonViewModel.generatePersonViewModel().toString();
+  }
+}
diff --git a/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/JsonViewSpringmvcSchema.java b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/JsonViewSpringmvcSchema.java
new file mode 100644
index 0000000..39a1b11
--- /dev/null
+++ b/integration-tests/it-producer/src/main/java/org/apache/servicecomb/it/schema/JsonViewSpringmvcSchema.java
@@ -0,0 +1,79 @@
+/*
+ * 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.it.schema;
+
+import org.apache.servicecomb.provider.rest.common.RestSchema;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import com.fasterxml.jackson.annotation.JsonView;
+
+@RestSchema(schemaId = "jsonViewSpringmvcSchema")
+@RequestMapping(path = "/v1/jsonViewSpringmvcSchema")
+public class JsonViewSpringmvcSchema {
+
+  @GetMapping("/jsonViewDefault")
+  public PersonViewModel jsonViewDefault() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GetMapping("/jsonViewDefaultWithSummary")
+  @JsonView(PersonViewModel.Summary.class)
+  public PersonViewModel jsonViewDefaultWithSummary() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GetMapping("/jsonViewDefaultWithSummaryDetails")
+  @JsonView(PersonViewModel.SummaryWithDetails.class)
+  public PersonViewModel jsonViewDefaultWithSummaryDetails() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GetMapping(value = "/jsonViewProducesDefault", produces = "application/json")
+  public PersonViewModel jsonViewProducesDefault() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GetMapping(value = "/jsonViewProducesDefaultWithSummary", produces = "application/json")
+  @JsonView(PersonViewModel.Summary.class)
+  public PersonViewModel jsonViewProducesDefaultWithSummary() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GetMapping(value = "/jsonViewProducesDefaultWithSummaryDetails", produces = "application/json")
+  @JsonView(PersonViewModel.SummaryWithDetails.class)
+  public PersonViewModel jsonViewProducesDefaultWithSummaryDetails() {
+    return PersonViewModel.generatePersonViewModel();
+  }
+
+  @GetMapping(value = "/jsonViewPlainDefault", produces = "text/plain")
+  public String jsonViewPlainDefault() {
+    return PersonViewModel.generatePersonViewModel().toString();
+  }
+
+  @GetMapping(value = "/jsonViewPlainDefaultWithSummary", produces = "text/plain")
+  @JsonView(PersonViewModel.Summary.class)
+  public String jsonViewPlainDefaultWithSummary() {
+    return PersonViewModel.generatePersonViewModel().toString();
+  }
+
+  @GetMapping(value = "/jsonViewPlainDefaultWithSummaryDetails", produces = "text/plain")
+  @JsonView(PersonViewModel.SummaryWithDetails.class)
+  public String jsonViewPlainDefaultWithSummaryDetails() {
+    return PersonViewModel.generatePersonViewModel().toString();
+  }
+}