Skip to content

Commit a25fdd7

Browse files
committed
Jackson 3
1 parent 6449eb4 commit a25fdd7

File tree

10 files changed

+37
-52
lines changed

10 files changed

+37
-52
lines changed

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ org-springframework-boot = "4.0.0-SNAPSHOT"
66

77
[libraries]
88
ch-qos-logback-logback-core = { module = "ch.qos.logback:logback-core", version = "1.5.18" }
9-
com-fasterxml-jackson-core-jackson-databind = "com.fasterxml.jackson.core:jackson-databind:2.18.4"
10-
com-fasterxml-jackson-jackson-bom = "com.fasterxml.jackson:jackson-bom:2.17.3"
9+
jackson-databind = "tools.jackson.core:jackson-databind:3.0.0"
10+
jackson-bom = "tools.jackson:jackson-bom:3.0.0"
1111
com-google-code-findbugs-jsr305 = "com.google.code.findbugs:jsr305:3.0.2" # FIXME: Remove findbugs?
1212
com-h2database-h2 = "com.h2database:h2:2.3.232"
1313
com-ibm-db2-jcc = "com.ibm.db2:jcc:12.1.2.0"

spring-session-data-redis/spring-session-data-redis.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ dependencies {
2121
testImplementation "org.springframework.security:spring-security-core"
2222
testImplementation "org.springframework:spring-test"
2323
testImplementation "org.springframework:spring-web"
24+
testImplementation libs.jackson.databind
2425

2526
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine"
2627
testRuntimeOnly "org.junit.platform:junit-platform-launcher"

spring-session-dependencies/spring-session-dependencies.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ javaPlatform {
77
}
88

99
dependencies {
10-
api platform(libs.com.fasterxml.jackson.jackson.bom)
10+
api platform(libs.jackson.bom)
1111
api platform(libs.io.projectreactor.reactor.bom)
1212
api platform(libs.org.junit.junit.bom)
1313
api platform(libs.org.mockito.mockito.bom)

spring-session-samples/spring-session-sample-boot-jdbc-json-attribute/spring-session-sample-boot-jdbc-json-attribute.gradle

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ dependencies {
55
implementation project(':spring-session-jdbc')
66
implementation "nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect"
77
implementation "org.springframework.boot:spring-boot-session-jdbc"
8-
implementation libs.com.fasterxml.jackson.core.jackson.databind
9-
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"
8+
implementation libs.jackson.databind
109
implementation "org.springframework.boot:spring-boot-starter-jdbc"
1110
implementation "org.springframework.boot:spring-boot-starter-security"
1211
implementation "org.springframework.boot:spring-boot-starter-thymeleaf"

spring-session-samples/spring-session-sample-boot-jdbc-json-attribute/src/main/java/sample/config/SessionConfig.java

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
import java.io.InputStream;
55
import java.io.OutputStream;
66

7-
import com.fasterxml.jackson.databind.ObjectMapper;
7+
import tools.jackson.databind.ObjectMapper;
8+
import tools.jackson.databind.json.JsonMapper;
89

910
import org.springframework.beans.factory.BeanClassLoaderAware;
1011
import org.springframework.context.annotation.Bean;
@@ -14,7 +15,7 @@
1415
import org.springframework.core.serializer.Serializer;
1516
import org.springframework.core.serializer.support.DeserializingConverter;
1617
import org.springframework.core.serializer.support.SerializingConverter;
17-
import org.springframework.security.jackson2.SecurityJackson2Modules;
18+
import org.springframework.security.jackson.SecurityJacksonModules;
1819
import org.springframework.session.config.SessionRepositoryCustomizer;
1920
import org.springframework.session.jdbc.JdbcIndexedSessionRepository;
2021

@@ -43,23 +44,14 @@ SessionRepositoryCustomizer<JdbcIndexedSessionRepository> customizer() {
4344
};
4445
}
4546

46-
/**
47-
* Spring Boot provides auto configuration for Jackson 3 and not Jackson 2
48-
* (ObjectMapper) so we explicitly provide it here.
49-
* @return
50-
*/
51-
@Bean
52-
ObjectMapper objectMapper() {
53-
return new ObjectMapper();
54-
}
55-
5647
@Bean("springSessionConversionService")
57-
public GenericConversionService springSessionConversionService(ObjectMapper objectMapper) {
58-
ObjectMapper copy = objectMapper.copy();
59-
copy.registerModules(SecurityJackson2Modules.getModules(this.classLoader));
48+
public GenericConversionService springSessionConversionService() {
49+
JsonMapper mapper = JsonMapper.builder()
50+
.addModules(SecurityJacksonModules.getModules(this.classLoader))
51+
.build();
6052
GenericConversionService converter = new GenericConversionService();
61-
converter.addConverter(Object.class, byte[].class, new SerializingConverter(new JsonSerializer(copy)));
62-
converter.addConverter(byte[].class, Object.class, new DeserializingConverter(new JsonDeserializer(copy)));
53+
converter.addConverter(Object.class, byte[].class, new SerializingConverter(new JsonSerializer(mapper)));
54+
converter.addConverter(byte[].class, Object.class, new DeserializingConverter(new JsonDeserializer(mapper)));
6355
return converter;
6456
}
6557

spring-session-samples/spring-session-sample-boot-jdbc-json-attribute/src/test/java/sample/JdbcJsonAttributeTests.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,21 @@
1818

1919
import java.util.Base64;
2020

21-
import com.fasterxml.jackson.databind.ObjectMapper;
2221
import jakarta.servlet.http.Cookie;
2322
import org.junit.jupiter.api.BeforeEach;
2423
import org.junit.jupiter.api.Test;
24+
import tools.jackson.databind.json.JsonMapper;
2525

2626
import org.springframework.beans.factory.annotation.Autowired;
27+
import org.springframework.boot.jdbc.test.autoconfigure.AutoConfigureJdbc;
28+
import org.springframework.boot.jdbc.test.autoconfigure.AutoConfigureTestDatabase;
2729
import org.springframework.boot.security.autoconfigure.SecurityProperties;
2830
import org.springframework.boot.test.context.SpringBootTest;
2931
import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
3032
import org.springframework.context.annotation.Import;
3133
import org.springframework.jdbc.core.simple.JdbcClient;
3234
import org.springframework.security.core.context.SecurityContext;
33-
import org.springframework.security.jackson2.SecurityJackson2Modules;
35+
import org.springframework.security.jackson.SecurityJacksonModules;
3436
import org.springframework.test.web.servlet.MockMvc;
3537

3638
import static org.assertj.core.api.Assertions.assertThat;
@@ -45,10 +47,7 @@ class JdbcJsonAttributeTests {
4547
@Autowired
4648
MockMvc mvc;
4749

48-
@Autowired
49-
ObjectMapper objectMapper;
50-
51-
ObjectMapper objectMapperWithModules;
50+
JsonMapper mapper;
5251

5352
@Autowired
5453
JdbcClient jdbcClient;
@@ -62,9 +61,9 @@ void setSecurityProperties(SecurityProperties securityProperties) {
6261

6362
@BeforeEach
6463
void setup() {
65-
ObjectMapper copy = this.objectMapper.copy();
66-
copy.registerModules(SecurityJackson2Modules.getModules(getClass().getClassLoader()));
67-
this.objectMapperWithModules = copy;
64+
this.mapper = JsonMapper.builder()
65+
.addModules(SecurityJacksonModules.getModules(getClass().getClassLoader()))
66+
.build();
6867
this.jdbcClient.sql("DELETE FROM spring_session_attributes").update();
6968
this.jdbcClient.sql("DELETE FROM spring_session").update();
7069
}
@@ -83,8 +82,7 @@ void loginShouldSaveSecurityContextAsJson() throws Exception {
8382
WHERE attribute_name = 'SPRING_SECURITY_CONTEXT'
8483
AND s.session_id = :id
8584
""").param("id", sessionId).query().singleValue();
86-
SecurityContext securityContext = this.objectMapperWithModules.readValue((String) attributeBytes,
87-
SecurityContext.class);
85+
SecurityContext securityContext = this.mapper.readValue((String) attributeBytes, SecurityContext.class);
8886
assertThat(securityContext).isNotNull();
8987
assertThat(securityContext.getAuthentication().getName()).isEqualTo(this.username);
9088
}
@@ -96,8 +94,7 @@ void loginWhenQueryUsingJsonbOperatorThenReturns() throws Exception {
9694
SELECT attribute_bytes::text FROM spring_session_attributes
9795
WHERE attribute_bytes -> 'authentication' -> 'principal' ->> 'username' = '%s'
9896
""".formatted(this.username)).query().singleValue();
99-
SecurityContext securityContext = this.objectMapperWithModules.readValue((String) attributeBytes,
100-
SecurityContext.class);
97+
SecurityContext securityContext = this.mapper.readValue((String) attributeBytes, SecurityContext.class);
10198
assertThat(securityContext).isNotNull();
10299
assertThat(securityContext.getAuthentication().getName()).isEqualTo(this.username);
103100
}

spring-session-samples/spring-session-sample-boot-redis-json/spring-session-sample-boot-redis-json.gradle

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ dependencies {
1313
implementation "org.webjars:bootstrap"
1414
implementation "org.webjars:html5shiv"
1515
implementation "org.webjars:webjars-locator-core"
16-
implementation libs.com.fasterxml.jackson.core.jackson.databind
17-
implementation "com.fasterxml.jackson.datatype:jackson-datatype-jsr310"
16+
implementation libs.jackson.databind
1817

1918
testImplementation "org.assertj:assertj-core"
2019
testImplementation "org.junit.jupiter:junit-jupiter-api"

spring-session-samples/spring-session-sample-boot-redis-json/src/integration-test/java/sample/RedisSerializerTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222

2323
import org.springframework.boot.test.context.SpringBootTest;
2424
import org.springframework.boot.test.context.TestConfiguration;
25-
import org.springframework.context.annotation.Bean;
2625
import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
26+
import org.springframework.context.annotation.Bean;
2727
import org.springframework.data.redis.core.RedisTemplate;
28-
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
28+
import org.springframework.data.redis.serializer.JacksonJsonRedisSerializer;
2929
import org.springframework.session.data.redis.config.annotation.SpringSessionRedisOperations;
3030
import org.springframework.test.context.junit.jupiter.SpringExtension;
3131

@@ -48,8 +48,7 @@ class RedisSerializerTest {
4848
void testRedisTemplate() {
4949
assertThat(this.sessionRedisTemplate).isNotNull();
5050
assertThat(this.sessionRedisTemplate.getDefaultSerializer()).isNotNull();
51-
assertThat(this.sessionRedisTemplate.getDefaultSerializer())
52-
.isInstanceOf(GenericJackson2JsonRedisSerializer.class);
51+
assertThat(this.sessionRedisTemplate.getDefaultSerializer()).isInstanceOf(JacksonJsonRedisSerializer.class);
5352
}
5453

5554
@TestConfiguration

spring-session-samples/spring-session-sample-boot-redis-json/src/main/java/sample/config/SessionConfig.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616

1717
package sample.config;
1818

19-
import com.fasterxml.jackson.databind.ObjectMapper;
19+
import tools.jackson.databind.json.JsonMapper;
2020

2121
import org.springframework.beans.factory.BeanClassLoaderAware;
2222
import org.springframework.context.annotation.Bean;
2323
import org.springframework.context.annotation.Configuration;
24-
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
24+
import org.springframework.data.redis.serializer.JacksonJsonRedisSerializer;
2525
import org.springframework.data.redis.serializer.RedisSerializer;
26-
import org.springframework.security.jackson2.SecurityJackson2Modules;
26+
import org.springframework.security.jackson.SecurityJacksonModules;
2727

2828
/**
2929
* @author jitendra on 3/3/16.
@@ -41,18 +41,16 @@ public class SessionConfig implements BeanClassLoaderAware {
4141
*/
4242
@Bean
4343
public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
44-
return new GenericJackson2JsonRedisSerializer(objectMapper());
44+
return new JacksonJsonRedisSerializer<>(objectMapper(), Object.class);
4545
}
4646

4747
/**
48-
* Customized {@link ObjectMapper} to add mix-in for class that doesn't have default
48+
* Customized {@link JsonMapper} to add mix-in for class that doesn't have default
4949
* constructors
50-
* @return the {@link ObjectMapper} to use
50+
* @return the {@link JsonMapper} to use
5151
*/
52-
private ObjectMapper objectMapper() {
53-
ObjectMapper mapper = new ObjectMapper();
54-
mapper.registerModules(SecurityJackson2Modules.getModules(this.loader));
55-
return mapper;
52+
private JsonMapper objectMapper() {
53+
return JsonMapper.builder().addModules(SecurityJacksonModules.getModules(this.loader)).build();
5654
}
5755

5856
/*

spring-session-samples/spring-session-sample-javaconfig-rest/spring-session-sample-javaconfig-rest.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ dependencies {
1010
implementation "org.springframework:spring-webmvc"
1111
implementation "org.springframework.security:spring-security-config"
1212
implementation "org.springframework.security:spring-security-web"
13-
implementation "com.fasterxml.jackson.core:jackson-databind"
13+
implementation libs.jackson.databind
1414
implementation "org.slf4j:slf4j-api"
1515
implementation "org.slf4j:jcl-over-slf4j"
1616
implementation "org.slf4j:log4j-over-slf4j"

0 commit comments

Comments
 (0)