Fix sort problem for serialize and deserialize. Unit test added.

This commit is contained in:
Can Bezmen
2020-04-28 18:46:56 +03:00
parent ea3fb86690
commit 525bb603f7
5 changed files with 114 additions and 24 deletions

View File

@@ -45,6 +45,7 @@ import org.springframework.cloud.openfeign.support.AbstractFormWriter;
import org.springframework.cloud.openfeign.support.PageJacksonModule;
import org.springframework.cloud.openfeign.support.PageableSpringEncoder;
import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
import org.springframework.cloud.openfeign.support.SortJacksonModule;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.cloud.openfeign.support.SpringMvcContract;
@@ -84,7 +85,7 @@ public class FeignClientsConfiguration {
@ConditionalOnMissingBean
public Decoder feignDecoder() {
return new OptionalDecoder(
new ResponseEntityDecoder(new SpringDecoder(this.messageConverters)));
new ResponseEntityDecoder(new SpringDecoder(this.messageConverters)));
}
@Bean
@@ -98,17 +99,17 @@ public class FeignClientsConfiguration {
@ConditionalOnClass(name = "org.springframework.data.domain.Pageable")
@ConditionalOnMissingBean
public Encoder feignEncoderPageable(
ObjectProvider<AbstractFormWriter> formWriterProvider) {
ObjectProvider<AbstractFormWriter> formWriterProvider) {
PageableSpringEncoder encoder = new PageableSpringEncoder(
springEncoder(formWriterProvider));
springEncoder(formWriterProvider));
if (springDataWebProperties != null) {
encoder.setPageParameter(
springDataWebProperties.getPageable().getPageParameter());
springDataWebProperties.getPageable().getPageParameter());
encoder.setSizeParameter(
springDataWebProperties.getPageable().getSizeParameter());
springDataWebProperties.getPageable().getSizeParameter());
encoder.setSortParameter(
springDataWebProperties.getSort().getSortParameter());
springDataWebProperties.getSort().getSortParameter());
}
return encoder;
}
@@ -153,12 +154,18 @@ public class FeignClientsConfiguration {
return new PageJacksonModule();
}
@Bean
@ConditionalOnClass(name = "org.springframework.data.domain.Page")
public Module sortModule() {
return new SortJacksonModule();
}
private Encoder springEncoder(ObjectProvider<AbstractFormWriter> formWriterProvider) {
AbstractFormWriter formWriter = formWriterProvider.getIfAvailable();
if (formWriter != null) {
return new SpringEncoder(new SpringPojoFormEncoder(formWriter),
this.messageConverters);
this.messageConverters);
}
else {
return new SpringEncoder(new SpringFormEncoder(), this.messageConverters);
@@ -185,7 +192,7 @@ public class FeignClientsConfiguration {
super();
MultipartFormContentProcessor processor = (MultipartFormContentProcessor) getContentProcessor(
MULTIPART);
MULTIPART);
processor.addFirstWriter(formWriter);
}

View File

@@ -0,0 +1,35 @@
package org.springframework.cloud.openfeign.support;
import com.fasterxml.jackson.core.Version;
import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.module.SimpleDeserializers;
import com.fasterxml.jackson.databind.module.SimpleSerializers;
import org.springframework.data.domain.Sort;
/**
* This jackson module provides support to add serialize and deserialize for spring {@link Sort} object.
* @author canbezmen
*/
public class SortJacksonModule extends Module {
@Override
public String getModuleName() {
return "SortModule";
}
@Override
public Version version() {
return new Version(0, 1, 0, "", null, null);
}
@Override
public void setupModule(SetupContext context) {
SimpleSerializers serializers = new SimpleSerializers();
serializers.addSerializer(Sort.class, new SortJsonComponent.SortSerializer());
context.addSerializers(serializers);
SimpleDeserializers deserializers = new SimpleDeserializers();
deserializers.addDeserializer(Sort.class, new SortJsonComponent.SortDeserializer());
context.addDeserializers(deserializers);
}
}

View File

@@ -21,6 +21,8 @@ import java.util.Collections;
import com.netflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.Optional;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -81,6 +83,14 @@ public class FeignPageableEncodingTests {
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
assertThat(response.getBody()).isNotNull();
assertThat(pageable.getPageSize()).isEqualTo(response.getBody().getSize());
assertThat(response.getBody().getPageable().getSort()).hasSize(1);
Optional<Sort.Order> optionalOrder = response.getBody().getPageable().getSort().get()
.findFirst();
if (optionalOrder.isPresent()) {
Sort.Order order = optionalOrder.get();
assertThat(order.getDirection()).isEqualTo(Sort.Direction.ASC);
assertThat(order.getProperty()).isEqualTo("sortProperty");
}
}

View File

@@ -16,16 +16,12 @@
package org.springframework.cloud.openfeign.support;
import java.util.Optional;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import static org.assertj.core.api.Assertions.assertThat;
@@ -39,16 +35,13 @@ public class PageJacksonModuleTests {
@BeforeAll
public static void initialize() {
objectMapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(Sort.class, new SortJsonComponent.SortSerializer());
module.addDeserializer(Sort.class, new SortJsonComponent.SortDeserializer());
objectMapper.registerModules(new PageJacksonModule(), module);
objectMapper.registerModule(new PageJacksonModule());
}
@Test
public void deserializePage() throws JsonProcessingException {
// Given
String pageJson = "{\"content\":[\"A name\"],\"number\":1,\"size\":2,\"totalElements\":3,\"sort\":[{\"direction\":\"ASC\",\"property\":\"field\",\"ignoreCase\":false,\"nullHandling\":\"NATIVE\",\"descending\":false,\"ascending\":true}]}";
String pageJson = "{\"content\":[\"A name\"], \"number\":1, \"size\":2, \"totalElements\": 3}";
// When
Page<?> result = objectMapper.readValue(pageJson, Page.class);
// Then
@@ -58,13 +51,6 @@ public class PageJacksonModuleTests {
assertThat(result.getPageable()).isNotNull();
assertThat(result.getPageable().getPageSize()).isEqualTo(2);
assertThat(result.getPageable().getPageNumber()).isEqualTo(1);
assertThat(result.getPageable().getSort()).hasSize(1);
Optional<Sort.Order> optionalOrder = result.getPageable().getSort().get().findFirst();
if (optionalOrder.isPresent()) {
Sort.Order order = optionalOrder.get();
assertThat(order.getDirection()).isEqualTo(Sort.Direction.ASC);
assertThat(order.getProperty()).isEqualTo("field");
}
}
}

View File

@@ -0,0 +1,52 @@
package org.springframework.cloud.openfeign.support;
import java.util.Optional;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import static org.assertj.core.api.Assertions.assertThat;
/**
* @author canbezmen
*/
class SortJacksonModuleTests {
private static ObjectMapper objectMapper;
@BeforeAll
public static void initialize() {
objectMapper = new ObjectMapper();
objectMapper.registerModules(new PageJacksonModule());
objectMapper.registerModule(new SortJacksonModule());
}
@Test
public void deserializePage() throws JsonProcessingException {
// Given
String pageJson = "{\"content\":[\"A name\"],\"number\":1,\"size\":2,\"totalElements\":3,\"sort\":[{\"direction\":\"ASC\",\"property\":\"field\",\"ignoreCase\":false,\"nullHandling\":\"NATIVE\",\"descending\":false,\"ascending\":true}]}";
// When
Page<?> result = objectMapper.readValue(pageJson, Page.class);
// Then
assertThat(result).isNotNull();
assertThat(result.getTotalElements()).isEqualTo(3);
assertThat(result.getContent()).hasSize(1);
assertThat(result.getPageable()).isNotNull();
assertThat(result.getPageable().getPageSize()).isEqualTo(2);
assertThat(result.getPageable().getPageNumber()).isEqualTo(1);
assertThat(result.getPageable().getSort()).hasSize(1);
Optional<Sort.Order> optionalOrder = result.getPageable().getSort().get()
.findFirst();
if (optionalOrder.isPresent()) {
Sort.Order order = optionalOrder.get();
assertThat(order.getDirection()).isEqualTo(Sort.Direction.ASC);
assertThat(order.getProperty()).isEqualTo("field");
}
}
}