Skip to content

Commit

Permalink
Merge branch '2.5.x'
Browse files Browse the repository at this point in the history
Closes gh-27362
  • Loading branch information
wilkinsona committed Jul 16, 2021
2 parents cdd80e6 + 1e09ef1 commit bc8ab6c
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2012-2020 the original author or authors.
* Copyright 2012-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -20,8 +20,10 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
Expand Down Expand Up @@ -63,6 +65,15 @@ public class HttpMessageConverters implements Iterable<HttpMessageConverter<?>>
NON_REPLACING_CONVERTERS = Collections.unmodifiableList(nonReplacingConverters);
}

private static final Map<Class<?>, Class<?>> EQUIVALENT_CONVERTERS;

static {
Map<Class<?>, Class<?>> equivalentConverters = new HashMap<>();
putIfExists(equivalentConverters, "org.springframework.http.converter.json.MappingJackson2HttpMessageConverter",
"org.springframework.http.converter.json.GsonHttpMessageConverter");
EQUIVALENT_CONVERTERS = Collections.unmodifiableMap(equivalentConverters);
}

private final List<HttpMessageConverter<?>> converters;

/**
Expand Down Expand Up @@ -132,7 +143,12 @@ private boolean isReplacement(HttpMessageConverter<?> defaultConverter, HttpMess
return false;
}
}
return ClassUtils.isAssignableValue(defaultConverter.getClass(), candidate);
Class<?> converterClass = defaultConverter.getClass();
if (ClassUtils.isAssignableValue(converterClass, candidate)) {
return true;
}
Class<?> equivalentClass = EQUIVALENT_CONVERTERS.get(converterClass);
return equivalentClass != null && ClassUtils.isAssignableValue(equivalentClass, candidate);
}

private void configurePartConverters(AllEncompassingFormHttpMessageConverter formConverter,
Expand Down Expand Up @@ -220,4 +236,13 @@ private static void addClassIfExists(List<Class<?>> list, String className) {
}
}

private static void putIfExists(Map<Class<?>, Class<?>> map, String keyClassName, String valueClassName) {
try {
map.put(Class.forName(keyClassName), Class.forName(valueClassName));
}
catch (ClassNotFoundException | NoClassDefFoundError ex) {
// Ignore
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

import org.junit.jupiter.api.Test;

Expand All @@ -28,6 +29,7 @@
import org.springframework.http.converter.ResourceRegionHttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.cbor.MappingJackson2CborHttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.http.converter.smile.MappingJackson2SmileHttpMessageConverter;
import org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter;
Expand Down Expand Up @@ -80,6 +82,16 @@ void addBeforeExistingConverter() {
assertThat(converters.getConverters().indexOf(converter1)).isNotEqualTo(0);
}

@Test
void addBeforeExistingEquivalentConverter() {
GsonHttpMessageConverter converter1 = new GsonHttpMessageConverter();
HttpMessageConverters converters = new HttpMessageConverters(converter1);
List<Class<?>> converterClasses = converters.getConverters().stream().map(HttpMessageConverter::getClass)
.collect(Collectors.toList());
assertThat(converterClasses).containsSequence(GsonHttpMessageConverter.class,
MappingJackson2HttpMessageConverter.class);
}

@Test
void addNewConverters() {
HttpMessageConverter<?> converter1 = mock(HttpMessageConverter.class);
Expand Down

0 comments on commit bc8ab6c

Please sign in to comment.