Skip to content

Commit 3ba50fb

Browse files
authored
Merge pull request #546 from felleslosninger/gne-spring-boot-4
EIN-4905: Spring Boot 4
2 parents 88cb121 + 6e69aaf commit 3ba50fb

File tree

24 files changed

+201
-189
lines changed

24 files changed

+201
-189
lines changed

pom.xml

Lines changed: 41 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -7,62 +7,32 @@
77
<artifactId>backend</artifactId>
88
<version>3.0.0-SNAPSHOT</version>
99
<name>backend</name>
10-
<description>eInnsyn API v3</description>
10+
<description>eInnsyn API</description>
1111

1212
<parent>
1313
<groupId>org.springframework.boot</groupId>
1414
<artifactId>spring-boot-starter-parent</artifactId>
15-
<version>3.5.11</version>
15+
<version>4.0.4</version>
1616
<relativePath />
1717
</parent>
1818

1919
<properties>
2020
<java.version>25</java.version>
2121
<bouncycastle.version>1.83</bouncycastle.version>
2222
<mockito.version>5.14.2</mockito.version>
23+
<logstash-logback-encoder.version>9.0</logstash-logback-encoder.version>
24+
<ip-client.version>2.5.0</ip-client.version>
25+
<nocommons.version>0.17.0</nocommons.version>
26+
<shedlock.version>7.7.0</shedlock.version>
27+
<java-uuid-generator.version>5.2.0</java-uuid-generator.version>
28+
<json.version>20251224</json.version>
29+
<mustache.version>0.9.14</mustache.version>
30+
<testcontainers.version>1.21.4</testcontainers.version>
31+
<spotless-maven-plugin.version>3.4.0</spotless-maven-plugin.version>
32+
<google-java-format.version>1.28.0</google-java-format.version>
2333
<jacoco.version>0.8.14</jacoco.version>
2434
</properties>
2535

26-
<dependencyManagement>
27-
<dependencies>
28-
<dependency>
29-
<groupId>commons-io</groupId>
30-
<artifactId>commons-io</artifactId>
31-
<version>2.21.0</version>
32-
</dependency>
33-
<dependency>
34-
<groupId>com.nimbusds</groupId>
35-
<artifactId>nimbus-jose-jwt</artifactId>
36-
<version>10.8</version>
37-
</dependency>
38-
<dependency>
39-
<groupId>org.bouncycastle</groupId>
40-
<artifactId>bcpkix-jdk18on</artifactId>
41-
<version>${bouncycastle.version}</version>
42-
</dependency>
43-
<dependency>
44-
<groupId>org.bouncycastle</groupId>
45-
<artifactId>bcprov-jdk18on</artifactId>
46-
<version>${bouncycastle.version}</version>
47-
</dependency>
48-
<dependency>
49-
<groupId>org.checkerframework</groupId>
50-
<artifactId>checker-qual</artifactId>
51-
<version>3.54.0</version>
52-
</dependency>
53-
<dependency>
54-
<groupId>io.opentelemetry</groupId>
55-
<artifactId>opentelemetry-api-incubator</artifactId>
56-
<version>1.60.1-alpha</version>
57-
</dependency>
58-
<dependency>
59-
<groupId>net.logstash.logback</groupId>
60-
<artifactId>logstash-logback-encoder</artifactId>
61-
<version>9.0</version>
62-
</dependency>
63-
</dependencies>
64-
</dependencyManagement>
65-
6636
<dependencies>
6737
<dependency>
6838
<groupId>org.springframework.boot</groupId>
@@ -80,12 +50,6 @@
8050
<groupId>org.springframework.security</groupId>
8151
<artifactId>spring-security-crypto</artifactId>
8252
</dependency>
83-
<dependency>
84-
<groupId>org.springframework.retry</groupId>
85-
<artifactId>spring-retry</artifactId>
86-
</dependency>
87-
88-
8953
<dependency>
9054
<groupId>org.springframework.boot</groupId>
9155
<artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
@@ -98,6 +62,22 @@
9862
<groupId>org.springframework.boot</groupId>
9963
<artifactId>spring-boot-starter-data-jpa</artifactId>
10064
</dependency>
65+
<dependency>
66+
<groupId>org.springframework.boot</groupId>
67+
<artifactId>spring-boot-starter-gson</artifactId>
68+
</dependency>
69+
<dependency>
70+
<groupId>org.springframework.boot</groupId>
71+
<artifactId>spring-boot-starter-elasticsearch</artifactId>
72+
</dependency>
73+
<dependency>
74+
<groupId>org.springframework.boot</groupId>
75+
<artifactId>spring-boot-starter-flyway</artifactId>
76+
</dependency>
77+
<dependency>
78+
<groupId>org.springframework.boot</groupId>
79+
<artifactId>spring-boot-starter-validation</artifactId>
80+
</dependency>
10181

10282
<dependency>
10383
<groupId>org.springframework.data</groupId>
@@ -109,15 +89,10 @@
10989
<artifactId>commons-lang3</artifactId>
11090
</dependency>
11191

112-
<dependency>
113-
<groupId>co.elastic.clients</groupId>
114-
<artifactId>elasticsearch-java</artifactId>
115-
</dependency>
116-
11792
<dependency>
11893
<groupId>no.einnsyn.common</groupId>
11994
<artifactId>ip-client</artifactId>
120-
<version>2.4.1</version>
95+
<version>${ip-client.version}</version>
12196
<exclusions>
12297
<exclusion>
12398
<groupId>org.assertj</groupId>
@@ -126,72 +101,60 @@
126101
</exclusions>
127102
</dependency>
128103

129-
<dependency>
130-
<groupId>org.flywaydb</groupId>
131-
<artifactId>flyway-core</artifactId>
132-
</dependency>
133-
134104
<dependency>
135105
<groupId>org.flywaydb</groupId>
136106
<artifactId>flyway-database-postgresql</artifactId>
137107
</dependency>
138108

139-
<dependency>
140-
<groupId>org.springframework.boot</groupId>
141-
<artifactId>spring-boot-starter-validation</artifactId>
142-
</dependency>
143109
<dependency>
144110
<groupId>org.postgresql</groupId>
145111
<artifactId>postgresql</artifactId>
146112
<scope>runtime</scope>
147113
</dependency>
114+
148115
<dependency>
149116
<groupId>org.projectlombok</groupId>
150117
<artifactId>lombok</artifactId>
151118
</dependency>
152-
<dependency>
153-
<groupId>com.google.code.gson</groupId>
154-
<artifactId>gson</artifactId>
155-
</dependency>
156119

157120
<!-- Foedselsnummer -->
158121
<dependency>
159122
<groupId>no.bekk.bekkopen</groupId>
160123
<artifactId>nocommons</artifactId>
161-
<version>0.17.0</version>
124+
<version>${nocommons.version}</version>
162125
</dependency>
163126

164127
<!-- Scheduler lock -->
165128
<dependency>
166129
<groupId>net.javacrumbs.shedlock</groupId>
167130
<artifactId>shedlock-spring</artifactId>
168-
<version>7.7.0</version>
131+
<version>${shedlock.version}</version>
169132
</dependency>
170133
<dependency>
171134
<groupId>net.javacrumbs.shedlock</groupId>
172135
<artifactId>shedlock-provider-jdbc-template</artifactId>
173-
<version>7.7.0</version>
136+
<version>${shedlock.version}</version>
174137
</dependency>
175138

176139

177140
<!-- Used for UUIDv7 generation-->
178141
<dependency>
179142
<groupId>com.fasterxml.uuid</groupId>
180143
<artifactId>java-uuid-generator</artifactId>
181-
<version>5.2.0</version>
144+
<version>${java-uuid-generator.version}</version>
182145
</dependency>
183146

184147
<dependency>
185148
<groupId>org.json</groupId>
186149
<artifactId>json</artifactId>
187-
<version>20251224</version>
150+
<version>${json.version}</version>
188151
</dependency>
189152

190153
<!-- E-mail templates -->
191154
<dependency>
192155
<groupId>com.github.spullara.mustache.java</groupId>
193156
<artifactId>compiler</artifactId>
194-
<version>0.9.14</version>
157+
<version>${mustache.version}</version>
195158
</dependency>
196159

197160
<!-- Metrics -->
@@ -216,13 +179,14 @@
216179
<dependency>
217180
<groupId>net.logstash.logback</groupId>
218181
<artifactId>logstash-logback-encoder</artifactId>
182+
<version>${logstash-logback-encoder.version}</version>
219183
</dependency>
220184

221185
<!-- Tests -->
222186
<dependency>
223187
<groupId>org.testcontainers</groupId>
224188
<artifactId>postgresql</artifactId>
225-
<version>1.21.4</version>
189+
<version>${testcontainers.version}</version>
226190
<scope>test</scope>
227191
<exclusions>
228192
<exclusion>
@@ -235,7 +199,7 @@
235199
<dependency>
236200
<groupId>org.testcontainers</groupId>
237201
<artifactId>elasticsearch</artifactId>
238-
<version>1.21.4</version>
202+
<version>${testcontainers.version}</version>
239203
<scope>test</scope>
240204
</dependency>
241205

@@ -260,12 +224,6 @@
260224
</exclusions>
261225
</dependency>
262226

263-
<dependency>
264-
<groupId>org.apache.httpcomponents.client5</groupId>
265-
<artifactId>httpclient5</artifactId>
266-
<scope>test</scope>
267-
</dependency>
268-
269227
<dependency>
270228
<groupId>org.springframework.boot</groupId>
271229
<artifactId>spring-boot-devtools</artifactId>
@@ -307,7 +265,7 @@
307265
<plugin>
308266
<groupId>com.diffplug.spotless</groupId>
309267
<artifactId>spotless-maven-plugin</artifactId>
310-
<version>3.4.0</version>
268+
<version>${spotless-maven-plugin.version}</version>
311269
<executions>
312270
<execution>
313271
<goals>
@@ -318,7 +276,7 @@
318276
<configuration>
319277
<java>
320278
<googleJavaFormat>
321-
<version>1.28.0</version>
279+
<version>${google-java-format.version}</version>
322280
<style>GOOGLE</style>
323281
</googleJavaFormat>
324282
</java>

src/main/java/no/einnsyn/backend/EInnsynApplication.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
import org.springframework.boot.autoconfigure.SpringBootApplication;
77
import org.springframework.context.annotation.ComponentScan;
88
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
9-
import org.springframework.retry.annotation.EnableRetry;
9+
import org.springframework.resilience.annotation.EnableResilientMethods;
1010
import org.springframework.scheduling.annotation.EnableAsync;
1111

1212
@SpringBootApplication
1313
@EnableJpaRepositories
1414
@EnableAsync
15-
@EnableRetry
15+
@EnableResilientMethods
1616
@ComponentScan("no.einnsyn")
1717
public class EInnsynApplication {
1818

src/main/java/no/einnsyn/backend/configuration/GsonConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import no.einnsyn.backend.configuration.typeadapters.ExpandableFieldSerializer;
1010
import no.einnsyn.backend.configuration.typeadapters.NoUnknownPropertiesTypeAdapterFactory;
1111
import no.einnsyn.backend.utils.id.IdResolver;
12-
import org.springframework.boot.autoconfigure.gson.GsonBuilderCustomizer;
12+
import org.springframework.boot.gson.autoconfigure.GsonBuilderCustomizer;
1313
import org.springframework.context.annotation.Bean;
1414
import org.springframework.context.annotation.Configuration;
1515
import org.springframework.context.annotation.Primary;

src/main/java/no/einnsyn/backend/entities/apikey/ApiKeyService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import org.apache.commons.codec.digest.DigestUtils;
1717
import org.springframework.beans.factory.annotation.Autowired;
1818
import org.springframework.context.annotation.Lazy;
19-
import org.springframework.retry.annotation.Retryable;
19+
import org.springframework.resilience.annotation.Retryable;
2020
import org.springframework.stereotype.Service;
2121
import org.springframework.transaction.annotation.Transactional;
2222

src/main/java/no/einnsyn/backend/entities/base/BaseService.java

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,7 @@
8080
import org.springframework.context.annotation.Lazy;
8181
import org.springframework.data.domain.PageRequest;
8282
import org.springframework.orm.ObjectOptimisticLockingFailureException;
83-
import org.springframework.retry.annotation.Backoff;
84-
import org.springframework.retry.annotation.Retryable;
83+
import org.springframework.resilience.annotation.Retryable;
8584
import org.springframework.transaction.annotation.Propagation;
8685
import org.springframework.transaction.annotation.Transactional;
8786
import org.springframework.web.context.request.RequestContextHolder;
@@ -623,9 +622,7 @@ public D get(String id, GetParameters query) throws EInnsynException {
623622
*/
624623
@NewSpan
625624
@Transactional(rollbackFor = Exception.class)
626-
@Retryable(
627-
retryFor = {ObjectOptimisticLockingFailureException.class},
628-
backoff = @Backoff(delay = 100, random = true))
625+
@Retryable(includes = {ObjectOptimisticLockingFailureException.class})
629626
public D add(D dto) throws EInnsynException {
630627
authorizeAdd(dto);
631628

@@ -661,9 +658,7 @@ public D add(D dto) throws EInnsynException {
661658
*/
662659
@NewSpan
663660
@Transactional(rollbackFor = Exception.class)
664-
@Retryable(
665-
retryFor = {ObjectOptimisticLockingFailureException.class},
666-
backoff = @Backoff(delay = 100, random = true))
661+
@Retryable(includes = {ObjectOptimisticLockingFailureException.class})
667662
public D update(String id, D dto) throws EInnsynException {
668663
var paths = ExpandPathResolver.resolve(dto);
669664
var obj = getProxy().findForUpdateOrThrow(id, dto);
@@ -682,9 +677,7 @@ public D update(String id, D dto) throws EInnsynException {
682677
*/
683678
@NewSpan
684679
@Transactional(rollbackFor = Exception.class)
685-
@Retryable(
686-
retryFor = {ObjectOptimisticLockingFailureException.class},
687-
backoff = @Backoff(delay = 100, random = true))
680+
@Retryable(includes = {ObjectOptimisticLockingFailureException.class})
688681
public D delete(String id) throws EInnsynException {
689682
authorizeDelete(id);
690683

src/main/java/no/einnsyn/backend/entities/base/models/Base.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import lombok.Getter;
1212
import lombok.Setter;
1313
import no.einnsyn.backend.utils.id.IdGenerator;
14-
import org.hibernate.annotations.CreationTimestamp;
1514
import org.hibernate.annotations.Filter;
1615
import org.hibernate.annotations.FilterDef;
1716
import org.hibernate.annotations.UpdateTimestamp;
@@ -42,7 +41,6 @@ public abstract class Base {
4241
@Column(name = "_external_id")
4342
protected String externalId;
4443

45-
@CreationTimestamp
4644
@Column(name = "_created")
4745
protected Instant created;
4846

src/main/java/no/einnsyn/backend/entities/bruker/BrukerService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import org.springframework.beans.factory.annotation.Autowired;
3333
import org.springframework.beans.factory.annotation.Value;
3434
import org.springframework.context.annotation.Lazy;
35-
import org.springframework.retry.annotation.Retryable;
35+
import org.springframework.resilience.annotation.Retryable;
3636
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
3737
import org.springframework.security.crypto.password.PasswordEncoder;
3838
import org.springframework.stereotype.Service;

src/main/java/no/einnsyn/backend/entities/dokumentobjekt/DokumentobjektService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,10 @@ public URI getSourceUri(String id) throws EInnsynException {
268268
// Preserve already-encoded source URLs exactly as stored.
269269
return URI.create(sourceUrl);
270270
} catch (IllegalArgumentException _) {
271+
// Fall back to encoding for user-provided URLs with spaces/non-ASCII.
271272
try {
272273
return UriComponentsBuilder.fromUriString(sourceUrl).encode().build().toUri();
273-
} catch (IllegalArgumentException e) {
274+
} catch (Exception e) {
274275
throw new NotFoundException("Invalid source URL for " + id, e);
275276
}
276277
}

0 commit comments

Comments
 (0)