You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2020/12/16 00:43:37 UTC

[servicecomb-java-chassis] branch master updated: [SCB-2162]upgrade spring framerok to 5.2.9.RELEASE and spring boot to 2.3.4.RELEASE

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 58e61d8  [SCB-2162]upgrade spring framerok to 5.2.9.RELEASE and spring boot to 2.3.4.RELEASE
58e61d8 is described below

commit 58e61d8fbcde839af8bffa312a538a8df551b0be
Author: liubao <bi...@qq.com>
AuthorDate: Tue Dec 15 18:53:08 2020 +0800

    [SCB-2162]upgrade spring framerok to 5.2.9.RELEASE and spring boot to 2.3.4.RELEASE
---
 .../core/ConfigurationSpringInitializer.java       | 14 +----
 .../jaxrs/client/CodeFirstRestTemplateJaxrs.java   |  2 +-
 .../jaxrs/client/MultiErrorCodeServiceClient.java  |  5 +-
 demo/demo-jaxrs/pom.xml                            |  1 -
 .../IConfigurationEndpoint.java                    |  4 ++
 .../demo/multiServiceCenterClient/ServerBTest.java |  9 +++
 .../ConfigurationEndpoint.java                     | 25 ++++++++
 .../{microservice.yaml => application.properties}  | 11 +---
 .../src/main/resources/microservice.yaml           |  4 ++
 dependencies/default/pom.xml                       | 27 +--------
 .../config/LastPropertyPlaceholderConfigurer.java  |  4 +-
 .../TestLastPropertyPlaceholderConfigurer.java     |  4 +-
 integration-tests/it-consumer/pom.xml              |  1 -
 integration-tests/pom.xml                          | 18 +-----
 .../generator-spring-data/pom.xml                  |  5 --
 .../generator/springdata/SpringDataModule.java     | 66 ++++++++++++++++++++--
 .../springdata/TestPageResponseTypeProcessor.java  | 25 +++++---
 17 files changed, 137 insertions(+), 88 deletions(-)

diff --git a/core/src/main/java/org/apache/servicecomb/core/ConfigurationSpringInitializer.java b/core/src/main/java/org/apache/servicecomb/core/ConfigurationSpringInitializer.java
index 9d11189..dfe9413 100644
--- a/core/src/main/java/org/apache/servicecomb/core/ConfigurationSpringInitializer.java
+++ b/core/src/main/java/org/apache/servicecomb/core/ConfigurationSpringInitializer.java
@@ -35,8 +35,8 @@ import org.apache.servicecomb.foundation.bootstrap.BootStrapService;
 import org.apache.servicecomb.foundation.common.utils.SPIServiceUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
 import org.springframework.context.EnvironmentAware;
+import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
 import org.springframework.core.Ordered;
 import org.springframework.core.env.CompositePropertySource;
 import org.springframework.core.env.ConfigurableEnvironment;
@@ -47,7 +47,6 @@ import org.springframework.core.env.PropertySource;
 import org.springframework.util.StringUtils;
 
 import com.netflix.config.ConfigurationManager;
-import com.netflix.config.DynamicPropertyFactory;
 
 /**
  *  Adapt spring PropertySource and Archaius Configuration
@@ -64,7 +63,7 @@ import com.netflix.config.DynamicPropertyFactory;
  *  related to precedence of a KEY-VAlUE. That is cse.test in dynamic config may not override servicecomb.test in yml.
  *  Users need to use the same key as what is in config file to override.
  */
-public class ConfigurationSpringInitializer extends PropertyPlaceholderConfigurer implements EnvironmentAware {
+public class ConfigurationSpringInitializer extends PropertySourcesPlaceholderConfigurer implements EnvironmentAware {
   private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationSpringInitializer.class);
 
   public static final String EXTRA_CONFIG_SOURCE_PREFIX = "extraConfig-";
@@ -185,15 +184,6 @@ public class ConfigurationSpringInitializer extends PropertyPlaceholderConfigure
     return properties;
   }
 
-  @Override
-  protected String resolvePlaceholder(String placeholder, Properties props) {
-    String propertyValue = super.resolvePlaceholder(placeholder, props);
-    if (propertyValue == null) {
-      return DynamicPropertyFactory.getInstance().getStringProperty(placeholder, null).get();
-    }
-    return propertyValue;
-  }
-
   /**
    * Try to get a name for identifying the environment.
    * @param environment the target that the name is generated for.
diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/CodeFirstRestTemplateJaxrs.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/CodeFirstRestTemplateJaxrs.java
index fc33127..b44dd45 100644
--- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/CodeFirstRestTemplateJaxrs.java
+++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/CodeFirstRestTemplateJaxrs.java
@@ -118,6 +118,6 @@ public class CodeFirstRestTemplateJaxrs extends CodeFirstRestTemplate {
       }
     }
     TestMgr.check(404, exception.getRawStatusCode());
-    TestMgr.check("404 Not Found", exception.getMessage());
+    TestMgr.check("404 Not Found: [{\"message\":\"Not Found\"}]", exception.getMessage());
   }
 }
diff --git a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java
index 42031f5..0e588cc 100644
--- a/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java
+++ b/demo/demo-jaxrs/jaxrs-client/src/main/java/org/apache/servicecomb/demo/jaxrs/client/MultiErrorCodeServiceClient.java
@@ -103,7 +103,10 @@ public class MultiErrorCodeServiceClient implements CategorizedTestCase {
           .postForEntity(serverDirectURL + "/MultiErrorCodeService/errorCode", entity, MultiResponse200.class);
     } catch (HttpClientErrorException e) {
       TestMgr.check(e.getRawStatusCode(), 400);
-      TestMgr.check(e.getMessage(), "400 Bad Request");
+      TestMgr.check(e.getMessage(),
+          "400 Bad Request: [{\"message\":\"Parameter is not valid for operation "
+              + "[jaxrs.MultiErrorCodeService.errorCode]. Parameter is [request]. "
+              + "Processor is [body].\"}]");
     }
 
     entity = new HttpEntity<>(null, headers);
diff --git a/demo/demo-jaxrs/pom.xml b/demo/demo-jaxrs/pom.xml
index 26cdc51..47d9521 100644
--- a/demo/demo-jaxrs/pom.xml
+++ b/demo/demo-jaxrs/pom.xml
@@ -43,7 +43,6 @@
     <dependency>
       <groupId>org.springframework.data</groupId>
       <artifactId>spring-data-commons</artifactId>
-      <version>2.1.9.RELEASE</version>
     </dependency>
     <dependency>
       <groupId>org.apache.logging.log4j</groupId>
diff --git a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/IConfigurationEndpoint.java b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/IConfigurationEndpoint.java
index dc72a9f..b237db5 100644
--- a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/IConfigurationEndpoint.java
+++ b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/IConfigurationEndpoint.java
@@ -17,6 +17,10 @@
 
 package org.apache.servicecomb.demo.multiServiceCenterClient;
 
+import java.util.List;
+
 public interface IConfigurationEndpoint {
   String getValue(String key, int type);
+
+  List<String> getValueList(String key, int type);
 }
diff --git a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/ServerBTest.java b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/ServerBTest.java
index 42c3c62..cbb2b42 100644
--- a/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/ServerBTest.java
+++ b/demo/demo-multi-service-center/demo-multi-service-center-client/src/main/java/org/apache/servicecomb/demo/multiServiceCenterClient/ServerBTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.servicecomb.demo.multiServiceCenterClient;
 
+import java.util.Arrays;
+
 import org.apache.servicecomb.demo.CategorizedTestCase;
 import org.apache.servicecomb.demo.TestMgr;
 import org.apache.servicecomb.provider.pojo.RpcReference;
@@ -49,6 +51,13 @@ public class ServerBTest implements CategorizedTestCase {
     TestMgr.check("key5-high", configurationEndpoint.getValue("demo.multi.service.center.serverB.key5", 1));
     TestMgr.check("key5-high", configurationEndpoint.getValue("demo.multi.service.center.serverB.key5", 2));
     TestMgr.check("key5-high", configurationEndpoint.getValue("demo.multi.service.center.serverB.key5", 3));
+    TestMgr.check("key6", configurationEndpoint.getValue("demo.multi.service.center.serverB.key6", 1));
+    TestMgr.check("key6", configurationEndpoint.getValue("demo.multi.service.center.serverB.key6", 2));
+    TestMgr.check("key6", configurationEndpoint.getValue("demo.multi.service.center.serverB.key6", 3));
+    TestMgr.check(Arrays.asList("key71", "key72"),
+        configurationEndpoint.getValueList("demo.multi.service.center.serverB.key7", 1));
+    TestMgr.check(Arrays.asList("key71", "key72"),
+        configurationEndpoint.getValueList("demo.multi.service.center.serverB.key7", 2));
   }
 
   @Override
diff --git a/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/java/org/apache/servicecomb/demo/multiServiceCenterServerB/ConfigurationEndpoint.java b/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/java/org/apache/servicecomb/demo/multiServiceCenterServerB/ConfigurationEndpoint.java
index 19be127..ec0b8f4 100644
--- a/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/java/org/apache/servicecomb/demo/multiServiceCenterServerB/ConfigurationEndpoint.java
+++ b/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/java/org/apache/servicecomb/demo/multiServiceCenterServerB/ConfigurationEndpoint.java
@@ -17,6 +17,8 @@
 
 package org.apache.servicecomb.demo.multiServiceCenterServerB;
 
+import java.util.List;
+
 import javax.ws.rs.core.MediaType;
 
 import org.apache.servicecomb.provider.rest.common.RestSchema;
@@ -55,6 +57,12 @@ public class ConfigurationEndpoint {
   @Value("${demo.multi.service.center.serverB.key5}")
   private String key5;
 
+  @Value("${demo.multi.service.center.serverB.key6}")
+  private String key6;
+
+  @Value("${demo.multi.service.center.serverB.key7}")
+  private List<String> key7;
+
   @GetMapping(path = "/config")
   public String getValue(@RequestParam(name = "key") String key, @RequestParam(name = "type") int type) {
     if (type == 1) {
@@ -73,6 +81,23 @@ public class ConfigurationEndpoint {
           return key4;
         case "demo.multi.service.center.serverB.key5":
           return key5;
+        case "demo.multi.service.center.serverB.key6":
+          return key6;
+        default:
+          return null;
+      }
+    }
+  }
+
+  @SuppressWarnings("unchecked")
+  @GetMapping(path = "/configList")
+  public List<String> getValueList(@RequestParam(name = "key") String key, @RequestParam(name = "type") int type) {
+    if (type == 1) {
+      return environment.getProperty(key, List.class);
+    } else {
+      switch (key) {
+        case "demo.multi.service.center.serverB.key7":
+          return key7;
         default:
           return null;
       }
diff --git a/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/resources/microservice.yaml b/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/resources/application.properties
similarity index 85%
copy from demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/resources/microservice.yaml
copy to demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/resources/application.properties
index ff62f18..6072aab 100644
--- a/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/resources/microservice.yaml
+++ b/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/resources/application.properties
@@ -15,11 +15,6 @@
 ## limitations under the License.
 ## ---------------------------------------------------------------------------
 
-servicecomb-config-order: 1
-
-demo.multi.service.center.serverB:
-  key1: key1-override
-  key2: key2-override
-  key5: key5
-  actual:
-    key5: key5-high
+demo.multi.service.center.serverB.actual.key6=key6
+demo.multi.service.center.serverB.actual.key7.1=key71
+demo.multi.service.center.serverB.actual.key7.2=key72
\ No newline at end of file
diff --git a/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/resources/microservice.yaml b/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/resources/microservice.yaml
index ff62f18..52cd6c8 100644
--- a/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/resources/microservice.yaml
+++ b/demo/demo-multi-service-center/demo-multi-service-center-serverB/src/main/resources/microservice.yaml
@@ -23,3 +23,7 @@ demo.multi.service.center.serverB:
   key5: key5
   actual:
     key5: key5-high
+  key6: ${demo.multi.service.center.serverB.actual.key6}
+  key7:
+    - ${demo.multi.service.center.serverB.actual.key7.1}
+    - ${demo.multi.service.center.serverB.actual.key7.2}
\ No newline at end of file
diff --git a/dependencies/default/pom.xml b/dependencies/default/pom.xml
index 9f1117e..c2b3b19 100644
--- a/dependencies/default/pom.xml
+++ b/dependencies/default/pom.xml
@@ -46,8 +46,6 @@
     <commons-logging.version>1.2</commons-logging.version>
     <cxf.version>3.3.1</cxf.version>
     <dyuproject-protostuff.version>1.0.7.fixed.3500</dyuproject-protostuff.version>
-    <embed.version>8.5.32</embed.version>
-    <embed-logging-juli.version>8.5.2</embed-logging-juli.version>
     <esotericsoftware.version>4.0.2</esotericsoftware.version>
     <findbugs-annotations.version>2.0.0</findbugs-annotations.version>
     <findbugs-jsr305.version>3.0.2</findbugs-jsr305.version>
@@ -99,8 +97,8 @@
     <slf4j.version>1.7.30</slf4j.version>
     <snakeyaml.version>1.27</snakeyaml.version>
     <spectator.version>0.83.0</spectator.version>
-    <spring.version>5.1.14.RELEASE</spring.version>
-    <spring-boot.version>2.1.6.RELEASE</spring-boot.version>
+    <spring.version>5.2.9.RELEASE</spring.version>
+    <spring-boot.version>2.3.4.RELEASE</spring-boot.version>
     <stax2-api.version>4.2</stax2-api.version>
     <swagger.version>1.5.24</swagger.version>
     <swagger2markup.version>1.3.3</swagger2markup.version>
@@ -667,27 +665,6 @@
       </dependency>
 
       <dependency>
-        <groupId>org.apache.tomcat.embed</groupId>
-        <artifactId>tomcat-embed-core</artifactId>
-        <version>${embed.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.tomcat.embed</groupId>
-        <artifactId>tomcat-embed-el</artifactId>
-        <version>${embed.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.tomcat.embed</groupId>
-        <artifactId>tomcat-embed-logging-juli</artifactId>
-        <version>${embed-logging-juli.version}</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.tomcat.embed</groupId>
-        <artifactId>tomcat-embed-websocket</artifactId>
-        <version>${embed.version}</version>
-      </dependency>
-
-      <dependency>
         <groupId>org.apache.zookeeper</groupId>
         <artifactId>zookeeper</artifactId>
         <version>${zookeeper.version}</version>
diff --git a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/LastPropertyPlaceholderConfigurer.java b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/LastPropertyPlaceholderConfigurer.java
index 374334e..769582f 100644
--- a/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/LastPropertyPlaceholderConfigurer.java
+++ b/foundations/foundation-config/src/main/java/org/apache/servicecomb/config/LastPropertyPlaceholderConfigurer.java
@@ -20,7 +20,7 @@ package org.apache.servicecomb.config;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
 import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
-import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
+import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
 import org.springframework.core.Ordered;
 import org.springframework.stereotype.Component;
 
@@ -36,6 +36,6 @@ public class LastPropertyPlaceholderConfigurer implements BeanFactoryPostProcess
 
   @Override
   public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
-    new PropertyPlaceholderConfigurer().postProcessBeanFactory(beanFactory);
+    new PropertySourcesPlaceholderConfigurer().postProcessBeanFactory(beanFactory);
   }
 }
diff --git a/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/TestLastPropertyPlaceholderConfigurer.java b/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/TestLastPropertyPlaceholderConfigurer.java
index d3d8491..223820c 100644
--- a/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/TestLastPropertyPlaceholderConfigurer.java
+++ b/foundations/foundation-config/src/test/java/org/apache/servicecomb/config/TestLastPropertyPlaceholderConfigurer.java
@@ -22,15 +22,15 @@ import java.util.Properties;
 
 import org.junit.Assert;
 import org.junit.Test;
-import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
 import org.springframework.context.EmbeddedValueResolverAware;
 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
 import org.springframework.stereotype.Component;
 import org.springframework.util.StringValueResolver;
 
 public class TestLastPropertyPlaceholderConfigurer {
   @Component
-  static class Bean extends PropertyPlaceholderConfigurer implements EmbeddedValueResolverAware {
+  static class Bean extends PropertySourcesPlaceholderConfigurer implements EmbeddedValueResolverAware {
     StringValueResolver resolver;
 
     public Bean() {
diff --git a/integration-tests/it-consumer/pom.xml b/integration-tests/it-consumer/pom.xml
index 5b5cc6d..a128a7c 100644
--- a/integration-tests/it-consumer/pom.xml
+++ b/integration-tests/it-consumer/pom.xml
@@ -36,7 +36,6 @@
     <dependency>
       <groupId>com.squareup.okhttp3</groupId>
       <artifactId>okhttp</artifactId>
-      <scope>compile</scope>
     </dependency>
 
     <dependency>
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 79de6fb..922a6cb 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -70,23 +70,7 @@
         <version>${project.version}</version>
         <type>test-jar</type>
       </dependency>
-      <dependency>
-        <groupId>io.zipkin.zipkin2</groupId>
-        <artifactId>zipkin</artifactId>
-        <version>2.9.3</version>
-      </dependency>
-      <dependency>
-        <groupId>io.zipkin.zipkin2</groupId>
-        <artifactId>zipkin-junit</artifactId>
-        <version>2.9.3</version>
-        <scope>test</scope>
-      </dependency>
-      <dependency>
-        <groupId>com.squareup.okhttp3</groupId>
-        <artifactId>okhttp</artifactId>
-        <version>3.10.0</version>
-        <scope>test</scope>
-      </dependency>
+
     </dependencies>
   </dependencyManagement>
   <dependencies>
diff --git a/swagger/swagger-generator/generator-spring-data/pom.xml b/swagger/swagger-generator/generator-spring-data/pom.xml
index c33169f..0b8e9d5 100644
--- a/swagger/swagger-generator/generator-spring-data/pom.xml
+++ b/swagger/swagger-generator/generator-spring-data/pom.xml
@@ -37,11 +37,6 @@
     <dependency>
       <groupId>org.springframework.data</groupId>
       <artifactId>spring-data-commons</artifactId>
-      <!-- based on business project dependency -->
-      <optional>true</optional>
-      <scope>provided</scope>
-      <!-- This is provided scope, better not add to dependency management, so add version here -->
-      <version>2.1.9.RELEASE</version>
     </dependency>
 
   </dependencies>
diff --git a/swagger/swagger-generator/generator-spring-data/src/main/java/org/apache/servicecomb/swagger/generator/springdata/SpringDataModule.java b/swagger/swagger-generator/generator-spring-data/src/main/java/org/apache/servicecomb/swagger/generator/springdata/SpringDataModule.java
index e8e06e4..7a56e72 100644
--- a/swagger/swagger-generator/generator-spring-data/src/main/java/org/apache/servicecomb/swagger/generator/springdata/SpringDataModule.java
+++ b/swagger/swagger-generator/generator-spring-data/src/main/java/org/apache/servicecomb/swagger/generator/springdata/SpringDataModule.java
@@ -16,6 +16,8 @@
  */
 package org.apache.servicecomb.swagger.generator.springdata;
 
+import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 import org.apache.servicecomb.foundation.common.utils.SPIOrder;
@@ -24,12 +26,17 @@ import org.springframework.data.domain.PageImpl;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Order;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.type.TypeFactory;
+import com.fasterxml.jackson.databind.util.Converter;
 
 public class SpringDataModule extends SimpleModule implements SPIOrder {
   private static final long serialVersionUID = 1L;
@@ -53,14 +60,63 @@ public class SpringDataModule extends SimpleModule implements SPIOrder {
     }
   }
 
+  public static class SortConverter implements Converter<SortMixin, Sort> {
+    @Override
+    public Sort convert(SortMixin value) {
+      return Sort.by(value.getProperties());
+    }
+
+    @Override
+    public JavaType getInputType(TypeFactory typeFactory) {
+      return typeFactory.constructType(SortMixin.class);
+    }
+
+    @Override
+    public JavaType getOutputType(TypeFactory typeFactory) {
+      return typeFactory.constructType(Sort.class);
+    }
+  }
+
+  public static class SortMixinConverter implements Converter<Sort, SortMixin> {
+    @Override
+    public SortMixin convert(Sort value) {
+      List<String> properties = new ArrayList<>();
+      Iterator<Order> iterator = value.iterator();
+      while (iterator.hasNext()) {
+        properties.add(iterator.next().getProperty());
+      }
+      SortMixin result = new SortMixin();
+      result.setProperties(properties.toArray(new String[0]));
+      return result;
+    }
+
+    @Override
+    public JavaType getInputType(TypeFactory typeFactory) {
+      return typeFactory.constructType(Sort.class);
+    }
+
+    @Override
+    public JavaType getOutputType(TypeFactory typeFactory) {
+      return typeFactory.constructType(SortMixin.class);
+    }
+  }
+
   @JsonPropertyOrder(alphabetic = true)
-  @JsonDeserialize(as = Sort.class)
+  @JsonDeserialize(converter = SortConverter.class)
+  @JsonSerialize(converter = SortMixinConverter.class)
   public static class SortMixin {
-    // Notice:
-    // spring data model changed from version to version
-    // for the tested version, sort is not consistency in serialization and deserialization
+    private String[] properties;
+
     @JsonCreator
-    public SortMixin(String... properties) {
+    public SortMixin() {
+    }
+
+    public void setProperties(String[] properties) {
+      this.properties = properties;
+    }
+
+    public String[] getProperties() {
+      return this.properties;
     }
   }
 
diff --git a/swagger/swagger-generator/generator-spring-data/src/test/java/org/apache/servicecomb/swagger/generator/springdata/TestPageResponseTypeProcessor.java b/swagger/swagger-generator/generator-spring-data/src/test/java/org/apache/servicecomb/swagger/generator/springdata/TestPageResponseTypeProcessor.java
index 5ae8c09..38ddaa2 100644
--- a/swagger/swagger-generator/generator-spring-data/src/test/java/org/apache/servicecomb/swagger/generator/springdata/TestPageResponseTypeProcessor.java
+++ b/swagger/swagger-generator/generator-spring-data/src/test/java/org/apache/servicecomb/swagger/generator/springdata/TestPageResponseTypeProcessor.java
@@ -17,11 +17,17 @@
 package org.apache.servicecomb.swagger.generator.springdata;
 
 import java.io.IOException;
+import java.util.Arrays;
 
 import org.apache.servicecomb.swagger.generator.core.unittest.UnitTestSwaggerUtils;
 import org.junit.Assert;
 import org.junit.Test;
 import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.domain.Sort.Direction;
 
 import io.swagger.util.Json;
 
@@ -39,14 +45,17 @@ public class TestPageResponseTypeProcessor {
   public void deserialize() throws IOException {
     Json.mapper().registerModule(new SpringDataModule());
 
-    String json = "{\"content\":[\"c1\",\"c2\"],\"pageable\":{\"pageNumber\":1,\"pageSize\":2}}";
-    Page<?> page = Json.mapper().readValue(json, Page.class);
-
+    Sort sort = Sort.by(Direction.ASC, "name");
+    Pageable pageable = PageRequest.of(1, 10, sort);
+    Page<String> page = new PageImpl<>(Arrays.asList("c1", "c2"), pageable, 2);
+    String json = Json.mapper().writeValueAsString(page);
     Assert.assertEquals(
-        "{\"content\":[\"c1\",\"c2\"],\"pageable\":{\"pageNumber\":1,\"pageSize\":2,"
-            + "\"offset\":2,\"paged\":true,\"unpaged\":false},\"empty\":false,\"first\":false,"
-            + "\"last\":true,\"number\":1,\"numberOfElements\":2,\"size\":2,"
-            + "\"totalElements\":4,\"totalPages\":2}",
-        Json.mapper().writeValueAsString(page));
+        "{\"content\":[\"c1\",\"c2\"],\"pageable\":{\"pageNumber\":1,\"pageSize\":10,\"sort\":{\"properties\":[\"name\"]},\"offset\":10,\"paged\":true,\"unpaged\":false},\"empty\":false,\"first\":false,\"last\":true,\"number\":1,\"numberOfElements\":2,\"size\":10,\"sort\":{\"properties\":[\"name\"]},\"totalElements\":12,\"totalPages\":2}",
+        json);
+
+    Page<?> page2 = Json.mapper().readValue(json, Page.class);
+
+    Assert.assertEquals(json,
+        Json.mapper().writeValueAsString(page2));
   }
 }