Polish "Upgrade to Jackson 2.12.0"

Guard breaking change to PropertyNamingStrategies so that we tolerate
older Jackson versions.

See gh-24415
pull/24582/head
Stephane Nicoll 4 years ago
parent 1f63b82c5b
commit a6c6655c82

@ -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;

Loading…
Cancel
Save