Polish "Upgrade to Jackson 2.12.0"
Guard breaking change to PropertyNamingStrategies so that we tolerate older Jackson versions. See gh-24415
This commit is contained in:
@@ -32,7 +32,6 @@ import com.fasterxml.jackson.annotation.JsonCreator;
|
||||
import com.fasterxml.jackson.annotation.PropertyAccessor;
|
||||
import com.fasterxml.jackson.databind.Module;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
|
||||
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
|
||||
@@ -258,10 +257,8 @@ public class JacksonAutoConfiguration {
|
||||
private void configurePropertyNamingStrategyField(Jackson2ObjectMapperBuilder builder, String fieldName) {
|
||||
// Find the field (this way we automatically support new constants
|
||||
// that may be added by Jackson in the future)
|
||||
Field field = ReflectionUtils.findField(PropertyNamingStrategies.class, fieldName,
|
||||
PropertyNamingStrategy.class);
|
||||
Assert.notNull(field, () -> "Constant named '" + fieldName + "' not found on "
|
||||
+ PropertyNamingStrategies.class.getName());
|
||||
Field field = findPropertyNamingStrategyField(fieldName);
|
||||
Assert.notNull(field, () -> "Constant named '" + fieldName + "' not found");
|
||||
try {
|
||||
builder.propertyNamingStrategy((PropertyNamingStrategy) field.get(null));
|
||||
}
|
||||
@@ -270,6 +267,17 @@ public class JacksonAutoConfiguration {
|
||||
}
|
||||
}
|
||||
|
||||
private Field findPropertyNamingStrategyField(String fieldName) {
|
||||
try {
|
||||
return ReflectionUtils.findField(com.fasterxml.jackson.databind.PropertyNamingStrategies.class,
|
||||
fieldName, PropertyNamingStrategy.class);
|
||||
}
|
||||
catch (NoClassDefFoundError ex) { // Fallback pre Jackson 2.12
|
||||
return ReflectionUtils.findField(PropertyNamingStrategy.class, fieldName,
|
||||
PropertyNamingStrategy.class);
|
||||
}
|
||||
}
|
||||
|
||||
private void configureModules(Jackson2ObjectMapperBuilder builder) {
|
||||
Collection<Module> moduleBeans = getBeans(this.applicationContext, Module.class);
|
||||
builder.modulesToInstall(moduleBeans.toArray(new Module[0]));
|
||||
|
||||
@@ -51,7 +51,7 @@ public class JacksonProperties {
|
||||
|
||||
/**
|
||||
* One of the constants on Jackson's PropertyNamingStrategies. Can also be a
|
||||
* fully-qualified class name of a PropertyNamingStrategy subclass.
|
||||
* fully-qualified class name of a PropertyNamingStrategy implementation.
|
||||
*/
|
||||
private String propertyNamingStrategy;
|
||||
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright 2012-2020 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://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.springframework.boot.autoconfigure.jackson;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import org.springframework.boot.testsupport.classpath.ClassPathExclusions;
|
||||
import org.springframework.boot.testsupport.classpath.ClassPathOverrides;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link JacksonAutoConfiguration} using Jackson 2.11.x
|
||||
*
|
||||
* @author Stephane Nicoll
|
||||
*/
|
||||
@ClassPathExclusions({ "jackson-databind*.jar", "jackson-dataformat-xml*.jar" })
|
||||
@ClassPathOverrides({ "com.fasterxml.jackson.core:jackson-databind:2.11.3",
|
||||
"com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.11.3" })
|
||||
public class Jackson211AutoConfigurationTests extends JacksonAutoConfigurationTests {
|
||||
|
||||
public static final String STRATEGY_CLASS_NAME = "com.fasterxml.jackson.databind.PropertyNamingStrategy$SnakeCaseStrategy";
|
||||
|
||||
@Test
|
||||
void customPropertyNamingStrategyField() {
|
||||
this.contextRunner.withPropertyValues("spring.jackson.property-naming-strategy:SNAKE_CASE").run((context) -> {
|
||||
ObjectMapper mapper = context.getBean(ObjectMapper.class);
|
||||
assertThat(mapper.getPropertyNamingStrategy().getClass().getName()).isEqualTo(STRATEGY_CLASS_NAME);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void customPropertyNamingStrategyClass() {
|
||||
this.contextRunner.withPropertyValues(
|
||||
"spring.jackson.property-naming-strategy:com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy")
|
||||
.run((context) -> {
|
||||
ObjectMapper mapper = context.getBean(ObjectMapper.class);
|
||||
assertThat(mapper.getPropertyNamingStrategy().getClass().getName()).isEqualTo(STRATEGY_CLASS_NAME);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -72,7 +72,7 @@ import static org.mockito.Mockito.mock;
|
||||
*/
|
||||
class JacksonAutoConfigurationTests {
|
||||
|
||||
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
protected final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
|
||||
.withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class));
|
||||
|
||||
@Test
|
||||
|
||||
@@ -19,7 +19,6 @@ package org.springframework.boot.buildpack.platform.json;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
|
||||
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
|
||||
import com.fasterxml.jackson.databind.SerializationFeature;
|
||||
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
Reference in New Issue
Block a user