Skip to content

Commit 08ac2e3

Browse files
committed
Upgraded to Jackson 3 and Spring 7
1 parent e11dc3e commit 08ac2e3

File tree

10 files changed

+72
-87
lines changed

10 files changed

+72
-87
lines changed

pom.xml

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,10 @@
5353
<java.version>21</java.version>
5454
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
5555

56-
<spring.boot.version>3.5.4</spring.boot.version>
56+
<spring.boot.version>4.0.0</spring.boot.version>
5757
<beanmapper.version>6.0.0</beanmapper.version>
5858
<el.api.version>6.0.1</el.api.version>
5959
<el.impl.version>4.0.2</el.impl.version>
60-
<hibernate-validator.version>8.0.1.Final</hibernate-validator.version>
6160
<hsqldb.version>2.7.4</hsqldb.version>
6261
<jakarta.servlet.version>6.1.0</jakarta.servlet.version>
6362
<jsonpath.version>2.10.0</jsonpath.version>
@@ -90,6 +89,11 @@
9089
<artifactId>beanmapper</artifactId>
9190
<version>${beanmapper.version}</version>
9291
</dependency>
92+
<dependency>
93+
<groupId>org.springframework</groupId>
94+
<artifactId>spring-web</artifactId>
95+
<scope>provided</scope>
96+
</dependency>
9397
<dependency>
9498
<groupId>org.springframework</groupId>
9599
<artifactId>spring-webmvc</artifactId>
@@ -117,12 +121,12 @@
117121
<scope>provided</scope>
118122
</dependency>
119123
<dependency>
120-
<groupId>com.fasterxml.jackson.core</groupId>
124+
<groupId>tools.jackson.core</groupId>
121125
<artifactId>jackson-core</artifactId>
122126
<scope>provided</scope>
123127
</dependency>
124128
<dependency>
125-
<groupId>com.fasterxml.jackson.core</groupId>
129+
<groupId>tools.jackson.core</groupId>
126130
<artifactId>jackson-databind</artifactId>
127131
<scope>provided</scope>
128132
</dependency>
@@ -132,6 +136,10 @@
132136
<artifactId>mockito-junit-jupiter</artifactId>
133137
<scope>test</scope>
134138
</dependency>
139+
<dependency>
140+
<groupId>org.springframework.boot</groupId>
141+
<artifactId>spring-boot-webmvc-test</artifactId>
142+
</dependency>
135143
<dependency>
136144
<groupId>com.jayway.jsonpath</groupId>
137145
<artifactId>json-path</artifactId>

src/main/java/io/beanmapper/spring/util/JsonUtil.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package io.beanmapper.spring.util;
22

33
import java.util.HashSet;
4-
import java.util.Iterator;
54
import java.util.Set;
65

7-
import com.fasterxml.jackson.core.JsonProcessingException;
8-
import com.fasterxml.jackson.databind.JsonNode;
9-
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import tools.jackson.core.JacksonException;
7+
import tools.jackson.databind.JsonNode;
8+
import tools.jackson.databind.ObjectMapper;
109

1110
/**
1211
* Utilities for working with JSON.
@@ -27,21 +26,18 @@ public static Set<String> getPropertyNamesFromJson(String json, ObjectMapper obj
2726
try {
2827
JsonNode tree = objectMapper.readTree(json);
2928
return getPropertyNames(tree, "");
30-
} catch (JsonProcessingException e) {
29+
} catch (JacksonException e) {
3130
throw new IllegalStateException("Could not retrieve property names from JSON.", e);
3231
}
3332
}
3433

3534
private static Set<String> getPropertyNames(JsonNode node, String base) {
3635
Set<String> propertyNames = new HashSet<>();
37-
Iterator<String> iterator = node.fieldNames();
38-
while (iterator.hasNext()) {
39-
String fieldName = iterator.next();
40-
36+
node.propertyNames().forEach(fieldName -> {
4137
String propertyName = isEmpty(base) ? fieldName : base + "." + fieldName;
4238
propertyNames.add(propertyName);
4339
propertyNames.addAll(getPropertyNames(node.get(fieldName), propertyName));
44-
}
40+
});
4541
return propertyNames;
4642
}
4743

src/main/java/io/beanmapper/spring/web/converter/StructuredJsonMessageConverter.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
import org.springframework.http.converter.HttpMessageConverter;
2121
import org.springframework.http.converter.HttpMessageNotReadableException;
2222
import org.springframework.http.converter.HttpMessageNotWritableException;
23-
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
23+
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
2424

2525
/**
26-
* Wraps the default Jackson2 message converter with read
26+
* Wraps the default Jackson message converter with read
2727
* functionality that returns both the message and property
2828
* names.
2929
*
@@ -32,9 +32,9 @@
3232
*/
3333
public class StructuredJsonMessageConverter implements HttpMessageConverter<Object> {
3434

35-
private final MappingJackson2HttpMessageConverter delegate;
35+
private final JacksonJsonHttpMessageConverter delegate;
3636

37-
public StructuredJsonMessageConverter(MappingJackson2HttpMessageConverter delegate) {
37+
public StructuredJsonMessageConverter(JacksonJsonHttpMessageConverter delegate) {
3838
this.delegate = delegate;
3939
}
4040

@@ -69,7 +69,7 @@ public List<MediaType> getSupportedMediaTypes() {
6969
public Object read(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
7070
String json = new String(inputMessage.getBody().readAllBytes(), UTF_8);
7171
Object body = delegate.read(clazz, new StringHttpInputMessage(inputMessage.getHeaders(), json));
72-
Set<String> propertyNames = JsonUtil.getPropertyNamesFromJson(json, delegate.getObjectMapper());
72+
Set<String> propertyNames = JsonUtil.getPropertyNamesFromJson(json, delegate.getMapper());
7373
return new StructuredBody(body, propertyNames);
7474
}
7575

src/test/java/io/beanmapper/spring/ApplicationConfig.java

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,15 @@
33
*/
44
package io.beanmapper.spring;
55

6-
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import static org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType.HSQL;
7+
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
11+
import javax.sql.DataSource;
12+
13+
import jakarta.persistence.EntityManagerFactory;
14+
import tools.jackson.databind.json.JsonMapper;
715

816
import org.hibernate.dialect.HSQLDialect;
917
import org.hibernate.jpa.HibernatePersistenceProvider;
@@ -22,13 +30,6 @@
2230
import org.springframework.web.bind.annotation.ControllerAdvice;
2331
import org.springframework.web.bind.annotation.RestController;
2432

25-
import jakarta.persistence.EntityManagerFactory;
26-
import javax.sql.DataSource;
27-
import java.util.HashMap;
28-
import java.util.Map;
29-
30-
import static org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType.HSQL;
31-
3233
@ComponentScan(
3334
basePackageClasses = ApplicationConfig.class,
3435
excludeFilters = {
@@ -83,10 +84,9 @@ public JpaTransactionManager transactionManager(@Autowired LocalContainerEntityM
8384
}
8485

8586
@Bean
86-
public ObjectMapper objectMapper() {
87-
ObjectMapper mapper = new ObjectMapper();
88-
mapper.findAndRegisterModules();
89-
return mapper;
87+
public JsonMapper objectMapper() {
88+
return JsonMapper.builder()
89+
.build();
9090
}
9191

9292
@Configuration

src/test/java/io/beanmapper/spring/web/PersonControllerTest.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
import java.util.Arrays;
1414
import java.util.List;
1515

16-
import jakarta.persistence.EntityManager;
17-
1816
import io.beanmapper.BeanMapper;
1917
import io.beanmapper.config.BeanMapperBuilder;
2018
import io.beanmapper.spring.ApplicationConfig;
@@ -24,36 +22,31 @@
2422
import io.beanmapper.spring.model.Tag;
2523
import io.beanmapper.spring.web.converter.StructuredJsonMessageConverter;
2624
import io.beanmapper.spring.web.mockmvc.AbstractControllerTest;
25+
import jakarta.persistence.EntityManager;
2726

2827
import org.junit.jupiter.api.BeforeEach;
2928
import org.junit.jupiter.api.Test;
3029
import org.junit.jupiter.api.extension.ExtendWith;
31-
import org.mockito.InjectMocks;
3230
import org.mockito.Mock;
3331
import org.mockito.junit.jupiter.MockitoExtension;
3432
import org.springframework.beans.factory.annotation.Autowired;
3533
import org.springframework.context.ApplicationContext;
3634
import org.springframework.format.support.FormattingConversionService;
3735
import org.springframework.http.MediaType;
38-
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
36+
import org.springframework.http.converter.HttpMessageConverter;
37+
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
3938
import org.springframework.mock.web.MockMultipartFile;
4039
import org.springframework.test.web.servlet.MockMvc;
4140
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
4241
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
4342
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
4443

45-
import com.fasterxml.jackson.databind.ObjectMapper;
46-
4744
@ExtendWith(MockitoExtension.class)
4845
public class PersonControllerTest extends AbstractControllerTest {
4946

47+
private HttpMessageConverter converter = new StructuredJsonMessageConverter(new JacksonJsonHttpMessageConverter());
5048
private BeanMapper beanMapper;
5149

52-
private MappingJackson2HttpMessageConverter converter;
53-
54-
@InjectMocks
55-
private ObjectMapper objectMapper;
56-
5750
@Autowired
5851
private ApplicationContext applicationContext;
5952

@@ -65,9 +58,6 @@ public class PersonControllerTest extends AbstractControllerTest {
6558

6659
@BeforeEach
6760
public void setUp() {
68-
converter = new MappingJackson2HttpMessageConverter();
69-
converter.setObjectMapper(objectMapper);
70-
7161
beanMapper = new BeanMapperBuilder()
7262
.addPackagePrefix(ApplicationConfig.class)
7363
.build();
@@ -78,7 +68,7 @@ public void setUp() {
7868
private MockMvc createWebClient(BeanMapper beanMapper) {
7969
return MockMvcBuilders.standaloneSetup(new PersonController())
8070
.setCustomArgumentResolvers(new MergedFormMethodArgumentResolver(
81-
List.of(new StructuredJsonMessageConverter(converter)),
71+
List.of(converter),
8272
beanMapper,
8373
applicationContext,
8474
entityManager))

src/test/java/io/beanmapper/spring/web/mockmvc/AbstractControllerTest.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,15 @@
99

1010
import org.springframework.beans.factory.annotation.Autowired;
1111
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
12-
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
13-
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
12+
import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc;
1413
import org.springframework.data.domain.Persistable;
1514
import org.springframework.data.repository.CrudRepository;
1615
import org.springframework.format.support.FormattingConversionService;
1716
import org.springframework.test.web.servlet.MockMvc;
1817
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
1918

2019
@AutoConfigureMockMvc
21-
@EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)
20+
@EnableAutoConfiguration
2221
public class AbstractControllerTest extends AbstractSpringTest {
2322

2423
private FakeWebMvcConfig config = new FakeWebMvcConfig();
@@ -32,14 +31,14 @@ protected void initWebClient(Object controller) {
3231

3332
this.mockMvcBeanMapper = new MockMvcBeanMapper(
3433
new FormattingConversionService(),
35-
Collections.singletonList(config.mappingJackson2HttpMessageConverter()),
34+
Collections.singletonList(config.structuredJsonMessageConverter()),
3635
new FakeApplicationConfig().beanMapper()
3736
);
3837
}
3938

4039
public void createWebClient(Object controller) {
4140
this.webClient = MockMvcBuilders.standaloneSetup(controller)
42-
.setMessageConverters(config.mappingJackson2HttpMessageConverter())
41+
.setMessageConverters(config.structuredJsonMessageConverter())
4342
.setCustomArgumentResolvers(mockMvcBeanMapper.createHandlerMethodArgumentResolvers())
4443
.setConversionService(mockMvcBeanMapper.getConversionService())
4544
.build();

src/test/java/io/beanmapper/spring/web/mockmvc/fakedomain/ContainingFakeForm.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
public class ContainingFakeForm {
77

8-
@BeanProperty(name = "fake")
8+
@BeanProperty("fake")
99
public Long fakeId;
1010

1111
@BeanIgnore

src/test/java/io/beanmapper/spring/web/mockmvc/fakedomain/ContainingFakeResult.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
public class ContainingFakeResult {
66

7-
@BeanProperty(name = "fake.name")
7+
@BeanProperty("fake.name")
88
public String fakeName;
99

1010
}

src/test/java/io/beanmapper/spring/web/mockmvc/fakedomain/FakeControllerTest.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,19 @@
1111
import io.beanmapper.spring.ApplicationConfig;
1212
import io.beanmapper.spring.web.mockmvc.AbstractControllerTest;
1313
import io.beanmapper.spring.web.mockmvc.FakeController;
14+
import tools.jackson.databind.json.JsonMapper;
1415

1516
import org.junit.jupiter.api.BeforeEach;
1617
import org.junit.jupiter.api.Test;
1718
import org.mockito.InjectMocks;
1819
import org.springframework.beans.factory.annotation.Autowired;
1920
import org.springframework.http.MediaType;
20-
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
21+
import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter;
2122
import org.springframework.test.context.bean.override.mockito.MockitoBean;
2223
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
2324
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
2425
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
2526

26-
import com.fasterxml.jackson.databind.ObjectMapper;
27-
2827
class FakeControllerTest extends AbstractControllerTest {
2928

3029
@InjectMocks
@@ -39,17 +38,16 @@ class FakeControllerTest extends AbstractControllerTest {
3938
@Autowired
4039
private FakeBuilder fakeBuilder;
4140

42-
@InjectMocks
43-
private ObjectMapper objectMapper;
41+
@MockitoBean
42+
private JsonMapper objectMapper;
4443

4544
private BeanMapper beanMapper;
4645

47-
private MappingJackson2HttpMessageConverter converter;
46+
private JacksonJsonHttpMessageConverter converter;
4847

4948
@BeforeEach
5049
void setup() {
51-
converter = new MappingJackson2HttpMessageConverter();
52-
converter.setObjectMapper(objectMapper);
50+
converter = new JacksonJsonHttpMessageConverter(objectMapper);
5351

5452
beanMapper = new BeanMapperBuilder()
5553
.addPackagePrefix(ApplicationConfig.class)

0 commit comments

Comments
 (0)