12_2_migrate_spring_boot_4 · JavaWebinar/topjava@b4d766b · GitHub
Skip to content

Commit b4d766b

Browse files
committed
12_2_migrate_spring_boot_4
1 parent 7aad3e5 commit b4d766b

14 files changed

Lines changed: 64 additions & 73 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions

pom.xml

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.springframework.boot</groupId>
77
<artifactId>spring-boot-starter-parent</artifactId>
8-
<version>3.5.14</version>
8+
<version>4.0.6</version>
99
<relativePath/> <!-- lookup parent from repository -->
1010
</parent>
1111
<groupId>ru.javaops</groupId>
@@ -17,7 +17,7 @@
1717

1818
<properties>
1919
<java.version>25</java.version>
20-
<springdoc.version>2.8.17</springdoc.version>
20+
<springdoc.version>3.0.3</springdoc.version>
2121
<jsoup.version>1.22.2</jsoup.version>
2222
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
2323
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
@@ -41,10 +41,10 @@
4141
<artifactId>spring-boot-starter-security</artifactId>
4242
</dependency>
4343

44-
<!-- jackson-->
44+
<!-- https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide#upgrading-jackson -->
4545
<dependency>
46-
<groupId>com.fasterxml.jackson.datatype</groupId>
47-
<artifactId>jackson-datatype-hibernate6</artifactId>
46+
<groupId>tools.jackson.datatype</groupId>
47+
<artifactId>jackson-datatype-hibernate7</artifactId>
4848
</dependency>
4949

5050
<!--Springdoc / Swagger-->
@@ -78,21 +78,22 @@
7878
<artifactId>lombok</artifactId>
7979
<optional>true</optional>
8080
</dependency>
81-
<dependency>
82-
<groupId>com.google.code.findbugs</groupId>
83-
<artifactId>annotations</artifactId>
84-
<version>3.0.1</version>
85-
<scope>compile</scope>
86-
</dependency>
8781

82+
<!-- Tests-->
8883
<dependency>
8984
<groupId>org.springframework.boot</groupId>
9085
<artifactId>spring-boot-starter-test</artifactId>
9186
<scope>test</scope>
9287
</dependency>
88+
<!-- https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide#module-dependencies-->
9389
<dependency>
94-
<groupId>org.springframework.security</groupId>
95-
<artifactId>spring-security-test</artifactId>
90+
<groupId>org.springframework.boot</groupId>
91+
<artifactId>spring-boot-starter-webmvc-test</artifactId>
92+
<scope>test</scope>
93+
</dependency>
94+
<dependency>
95+
<groupId>org.springframework.boot</groupId>
96+
<artifactId>spring-boot-starter-security-test</artifactId>
9697
<scope>test</scope>
9798
</dependency>
9899
<!-- https://youtrack.jetbrains.com/issue/IDEA-231927-->
@@ -120,18 +121,6 @@
120121
<plugin>
121122
<groupId>org.springframework.boot</groupId>
122123
<artifactId>spring-boot-maven-plugin</artifactId>
123-
<configuration>
124-
<excludes>
125-
<exclude>
126-
<groupId>org.projectlombok</groupId>
127-
<artifactId>lombok</artifactId>
128-
</exclude>
129-
<exclude>
130-
<groupId>com.google.code.findbugs</groupId>
131-
<artifactId>annotations</artifactId>
132-
</exclude>
133-
</excludes>
134-
</configuration>
135124
</plugin>
136125
<plugin>
137126
<!--https://junit.org/junit5/docs/current/user-guide/#running-tests-build-maven -->

src/main/java/ru/javaops/topjava/app/AuthUser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package ru.javaops.topjava.app;
22

33
import lombok.Getter;
4-
import org.springframework.lang.NonNull;
4+
import org.jspecify.annotations.NonNull;
55
import ru.javaops.topjava.user.model.Role;
66
import ru.javaops.topjava.user.model.User;
77

src/main/java/ru/javaops/topjava/app/config/AppConfig.java

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
package ru.javaops.topjava.app.config;
22

33
import com.fasterxml.jackson.annotation.JsonAutoDetect;
4-
import com.fasterxml.jackson.databind.ObjectMapper;
5-
import com.fasterxml.jackson.datatype.hibernate6.Hibernate6Module;
4+
import com.fasterxml.jackson.annotation.PropertyAccessor;
65
import lombok.extern.slf4j.Slf4j;
76
import org.h2.tools.Server;
8-
import org.springframework.beans.factory.annotation.Autowired;
97
import org.springframework.cache.annotation.EnableCaching;
108
import org.springframework.context.annotation.Bean;
119
import org.springframework.context.annotation.Configuration;
1210
import org.springframework.context.annotation.Profile;
1311
import org.springframework.http.ProblemDetail;
1412
import org.springframework.http.converter.json.ProblemDetailJacksonMixin;
1513
import ru.javaops.topjava.common.util.JsonUtil;
14+
import tools.jackson.databind.ObjectMapper;
15+
import tools.jackson.databind.json.JsonMapper;
16+
import tools.jackson.datatype.hibernate7.Hibernate7Module;
1617

1718
import java.sql.SQLException;
1819

@@ -36,11 +37,21 @@ Server h2Server() throws SQLException {
3637
interface MixIn extends ProblemDetailJacksonMixin {
3738
}
3839

39-
@Autowired
40-
void configureAndStoreObjectMapper(ObjectMapper objectMapper) {
41-
objectMapper.registerModule(new Hibernate6Module());
42-
// ErrorHandling: https://stackoverflow.com/questions/7421474/548473
43-
objectMapper.addMixIn(ProblemDetail.class, MixIn.class);
44-
JsonUtil.setMapper(objectMapper);
40+
// https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.0-Migration-Guide#upgrading-jackson
41+
@Bean
42+
ObjectMapper objectMapper() {
43+
ObjectMapper mapper = JsonMapper.builder()
44+
.changeDefaultVisibility(visibilityChecker -> visibilityChecker
45+
.withVisibility(PropertyAccessor.FIELD, ANY)
46+
.withVisibility(PropertyAccessor.GETTER, NONE)
47+
.withVisibility(PropertyAccessor.SETTER, NONE)
48+
.withVisibility(PropertyAccessor.IS_GETTER, NONE)
49+
)
50+
.addModule(new Hibernate7Module())
51+
// ErrorHandling: https://stackoverflow.com/questions/7421474/548473
52+
.addMixIn(ProblemDetail.class, MixIn.class)
53+
.build();
54+
JsonUtil.setMapper(mapper);
55+
return mapper;
4556
}
4657
}

src/main/java/ru/javaops/topjava/app/config/RestExceptionHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import org.springframework.core.NestedExceptionUtils;
1212
import org.springframework.dao.DataIntegrityViolationException;
1313
import org.springframework.http.ProblemDetail;
14-
import org.springframework.lang.NonNull;
14+
import org.jspecify.annotations.NonNull;
1515
import org.springframework.security.core.AuthenticationException;
1616
import org.springframework.security.web.firewall.RequestRejectedException;
1717
import org.springframework.validation.BindException;

src/main/java/ru/javaops/topjava/common/error/AppException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package ru.javaops.topjava.common.error;
22

33
import lombok.Getter;
4-
import org.springframework.lang.NonNull;
4+
import org.jspecify.annotations.NonNull;
55

66
public class AppException extends RuntimeException {
77
@Getter

src/main/java/ru/javaops/topjava/common/error/ErrorType.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
public enum ErrorType {
66
APP_ERROR("Application error", HttpStatus.INTERNAL_SERVER_ERROR),
7-
BAD_DATA("Wrong data", HttpStatus.UNPROCESSABLE_ENTITY),
8-
BAD_REQUEST("Bad request", HttpStatus.UNPROCESSABLE_ENTITY),
7+
BAD_DATA("Wrong data", HttpStatus.UNPROCESSABLE_CONTENT),
8+
BAD_REQUEST("Bad request", HttpStatus.UNPROCESSABLE_CONTENT),
99
DATA_CONFLICT("DataBase conflict", HttpStatus.CONFLICT),
1010
NOT_FOUND("Resource not found", HttpStatus.NOT_FOUND),
1111
AUTH_ERROR("Authorization error", HttpStatus.FORBIDDEN),

src/main/java/ru/javaops/topjava/common/util/JsonUtil.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package ru.javaops.topjava.common.util;
22

3-
import com.fasterxml.jackson.core.JsonProcessingException;
4-
import com.fasterxml.jackson.core.type.TypeReference;
5-
import com.fasterxml.jackson.databind.ObjectMapper;
6-
import com.fasterxml.jackson.databind.ObjectReader;
73
import lombok.experimental.UtilityClass;
4+
import tools.jackson.core.JacksonException;
5+
import tools.jackson.core.type.TypeReference;
6+
import tools.jackson.databind.ObjectMapper;
7+
import tools.jackson.databind.ObjectReader;
88

9-
import java.io.IOException;
109
import java.util.List;
1110
import java.util.Map;
1211

@@ -22,23 +21,23 @@ public static <T> List<T> readValues(String json, Class<T> clazz) {
2221
ObjectReader reader = mapper.readerFor(clazz);
2322
try {
2423
return reader.<T>readValues(json).readAll();
25-
} catch (IOException e) {
24+
} catch (JacksonException e) {
2625
throw new IllegalArgumentException("Invalid read array from JSON:\n'" + json + "'", e);
2726
}
2827
}
2928

3029
public static <T> T readValue(String json, Class<T> clazz) {
3130
try {
3231
return mapper.readValue(json, clazz);
33-
} catch (IOException e) {
32+
} catch (JacksonException e) {
3433
throw new IllegalArgumentException("Invalid read from JSON:\n'" + json + "'", e);
3534
}
3635
}
3736

3837
public static <T> String writeValue(T obj) {
3938
try {
4039
return mapper.writeValueAsString(obj);
41-
} catch (JsonProcessingException e) {
40+
} catch (JacksonException e) {
4241
throw new IllegalStateException("Invalid write to JSON:\n'" + obj + "'", e);
4342
}
4443
}

src/main/java/ru/javaops/topjava/user/model/User.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import lombok.Getter;
1111
import lombok.NoArgsConstructor;
1212
import lombok.Setter;
13-
import org.springframework.lang.NonNull;
13+
import org.jspecify.annotations.NonNull;
1414
import ru.javaops.topjava.common.HasIdAndEmail;
1515
import ru.javaops.topjava.common.model.NamedEntity;
1616
import ru.javaops.topjava.common.validation.NoHtml;

src/main/java/ru/javaops/topjava/user/web/UniqueMailValidator.java

Lines changed: 1 addition & 1 deletion

0 commit comments

Comments
 (0)