From af52052243e55a21b2203a0df8ba42e1ee29c59d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Dec 2025 08:25:42 +0000 Subject: [PATCH 01/21] Bump org.springframework.boot from 3.5.8 to 4.0.0 in /backend Bumps [org.springframework.boot](https://github.com/spring-projects/spring-boot) from 3.5.8 to 4.0.0. - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.5.8...v4.0.0) --- updated-dependencies: - dependency-name: org.springframework.boot dependency-version: 4.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- backend/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 537eb35460..facd049726 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -11,7 +11,7 @@ import java.io.Serializable plugins { java jacoco - id("org.springframework.boot") version "3.5.8" + id("org.springframework.boot") version "4.0.0" id("io.spring.dependency-management") version "1.1.7" id("com.diffplug.spotless") version "8.1.0" id("org.sonarqube") version "7.2.1.6560" From 5ae2f796024a37e103d799cc3825c08abf958eb4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Dec 2025 09:39:14 +0000 Subject: [PATCH 02/21] Bump org.springframework.cloud:spring-cloud-starter-kubernetes-client-config Bumps [org.springframework.cloud:spring-cloud-starter-kubernetes-client-config](https://github.com/spring-cloud/spring-cloud-kubernetes) from 3.3.0 to 5.0.0. - [Release notes](https://github.com/spring-cloud/spring-cloud-kubernetes/releases) - [Commits](https://github.com/spring-cloud/spring-cloud-kubernetes/compare/v3.3.0...v5.0.0) --- updated-dependencies: - dependency-name: org.springframework.cloud:spring-cloud-starter-kubernetes-client-config dependency-version: 5.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- backend/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index facd049726..79829f258a 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -166,7 +166,7 @@ dependencies { } implementation("org.springframework.security:spring-security-oauth2-resource-server:7.0.0") - implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-client-config:3.3.0") + implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-client-config:5.0.0") // CVE-2022-3171 implementation("com.google.protobuf:protobuf-java:4.33.2") From f152bbe9aa8a3e3ba11a3c21155ecdd10af09b0a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 01:06:26 +0000 Subject: [PATCH 03/21] Bump org.hibernate:hibernate-jpamodelgen in /backend Bumps [org.hibernate:hibernate-jpamodelgen](https://github.com/hibernate/hibernate-orm) from 6.6.36.Final to 7.1.11.Final. - [Release notes](https://github.com/hibernate/hibernate-orm/releases) - [Changelog](https://github.com/hibernate/hibernate-orm/blob/7.1.11/changelog.txt) - [Commits](https://github.com/hibernate/hibernate-orm/compare/6.6.36...7.1.11) --- updated-dependencies: - dependency-name: org.hibernate:hibernate-jpamodelgen dependency-version: 7.1.11.Final dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- backend/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 79829f258a..00fb549b51 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -251,7 +251,7 @@ dependencies { compileOnly("org.projectlombok:lombok") annotationProcessor("org.projectlombok:lombok") - annotationProcessor("org.hibernate:hibernate-jpamodelgen:6.6.36.Final") + annotationProcessor("org.hibernate:hibernate-jpamodelgen:7.1.11.Final") developmentOnly("org.springframework.boot:spring-boot-devtools") } From 59d18bd10238e9ad85b8f24f3c40eaf1ec834270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Fri, 12 Dec 2025 13:30:57 +0100 Subject: [PATCH 04/21] Fix flyway RISDEV-10437 --- backend/build.gradle.kts | 1 + .../bund/digitalservice/ris/caselaw/config/FlywayConfig.java | 4 ++-- .../caselaw/config/MultiSchemaFlywayMigrationStrategy.java | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 00fb549b51..15c1a5f073 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -165,6 +165,7 @@ dependencies { exclude(group = "net.minidev", module = "json-smart") } implementation("org.springframework.security:spring-security-oauth2-resource-server:7.0.0") + implementation("org.springframework.boot:spring-boot-starter-flyway") implementation("org.springframework.cloud:spring-cloud-starter-kubernetes-client-config:5.0.0") diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/FlywayConfig.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/FlywayConfig.java index dc0e07e998..8ce8af9ad7 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/FlywayConfig.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/FlywayConfig.java @@ -4,8 +4,8 @@ import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer; -import org.springframework.boot.autoconfigure.flyway.FlywayMigrationStrategy; +import org.springframework.boot.flyway.autoconfigure.FlywayMigrationInitializer; +import org.springframework.boot.flyway.autoconfigure.FlywayMigrationStrategy; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/MultiSchemaFlywayMigrationStrategy.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/MultiSchemaFlywayMigrationStrategy.java index 7be3f4b9e0..e55681253e 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/MultiSchemaFlywayMigrationStrategy.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/MultiSchemaFlywayMigrationStrategy.java @@ -1,7 +1,7 @@ package de.bund.digitalservice.ris.caselaw.config; import org.flywaydb.core.Flyway; -import org.springframework.boot.autoconfigure.flyway.FlywayMigrationStrategy; +import org.springframework.boot.flyway.autoconfigure.FlywayMigrationStrategy; import org.springframework.stereotype.Component; @Component From 476b4c6cb09665338938d7a5bf826eeab516227b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Fri, 12 Dec 2025 13:33:02 +0100 Subject: [PATCH 05/21] Replace PostgreSQLEnumJdbcType with NAMED_ENUM RISDEV-10437 --- .../ris/caselaw/adapter/database/jpa/DecisionDTO.java | 6 +++--- .../caselaw/adapter/database/jpa/DuplicateRelationDTO.java | 6 +++--- .../ris/caselaw/adapter/database/jpa/IncomeTypeDTO.java | 6 +++--- .../adapter/database/jpa/OriginOfTranslationDTO.java | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/DecisionDTO.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/DecisionDTO.java index ecb6120402..2ba46bbcb0 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/DecisionDTO.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/DecisionDTO.java @@ -32,9 +32,9 @@ import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; -import org.hibernate.annotations.JdbcType; -import org.hibernate.dialect.PostgreSQLEnumJdbcType; +import org.hibernate.annotations.JdbcTypeCode; import org.hibernate.proxy.HibernateProxy; +import org.hibernate.type.SqlTypes; @Getter @Setter @@ -270,7 +270,7 @@ public class DecisionDTO extends DocumentationUnitDTO { /** Rechtsmittel zugelassen durch */ @Column(name = "appeal_admitted_by") @Enumerated(EnumType.STRING) - @JdbcType(PostgreSQLEnumJdbcType.class) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private AppealAdmitter appealAdmittedBy; /** Rechtsmittel */ diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/DuplicateRelationDTO.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/DuplicateRelationDTO.java index a39305142a..0f49bcaa5a 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/DuplicateRelationDTO.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/DuplicateRelationDTO.java @@ -21,8 +21,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.hibernate.annotations.JdbcType; -import org.hibernate.dialect.PostgreSQLEnumJdbcType; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; @Getter @Setter @@ -37,7 +37,7 @@ public class DuplicateRelationDTO { @Column(name = "status") @Enumerated(EnumType.STRING) - @JdbcType(PostgreSQLEnumJdbcType.class) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private DuplicateRelationStatus relationStatus; @ManyToOne(fetch = FetchType.LAZY) diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/IncomeTypeDTO.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/IncomeTypeDTO.java index d0c9eab5d0..4a136eddf7 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/IncomeTypeDTO.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/IncomeTypeDTO.java @@ -17,8 +17,8 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; -import org.hibernate.annotations.JdbcType; -import org.hibernate.dialect.PostgreSQLEnumJdbcType; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; @Getter @Setter @@ -38,7 +38,7 @@ public class IncomeTypeDTO { @Column(name = "type_of_income") @Enumerated(EnumType.STRING) - @JdbcType(PostgreSQLEnumJdbcType.class) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private TypeOfIncome typeOfIncome; @Column @NotNull private Long rank; diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/OriginOfTranslationDTO.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/OriginOfTranslationDTO.java index c0db1a6527..bd4555d9fa 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/OriginOfTranslationDTO.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/OriginOfTranslationDTO.java @@ -22,8 +22,8 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import org.hibernate.annotations.JdbcType; -import org.hibernate.dialect.PostgreSQLEnumJdbcType; +import org.hibernate.annotations.JdbcTypeCode; +import org.hibernate.type.SqlTypes; @Getter @Setter @@ -43,7 +43,7 @@ public class OriginOfTranslationDTO { @Column(name = "translation_type") @Enumerated(EnumType.STRING) - @JdbcType(PostgreSQLEnumJdbcType.class) + @JdbcTypeCode(SqlTypes.NAMED_ENUM) private TranslationType translationType; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) From 9230099d1d6ffdf1333090f828bd87385354e05e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Fri, 21 Nov 2025 16:26:37 +0100 Subject: [PATCH 06/21] Rename HttpHeaders#containsKey to containsHeader RISDEV-10437 --- .../digitalservice/ris/caselaw/adapter/S3AttachmentService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/S3AttachmentService.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/S3AttachmentService.java index cb2ea93a59..ba17c49a20 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/S3AttachmentService.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/S3AttachmentService.java @@ -75,7 +75,7 @@ public S3AttachmentService( public Attachment attachFileToDocumentationUnit( UUID documentationUnitId, ByteBuffer byteBuffer, HttpHeaders httpHeaders, User user) { String fileName = - httpHeaders.containsKey("X-Filename") + httpHeaders.containsHeader("X-Filename") ? httpHeaders.getFirst("X-Filename") : "Kein Dateiname gefunden"; From b30392ca23c39a796cc02f83b451f3cfc64dd12f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Fri, 21 Nov 2025 16:27:01 +0100 Subject: [PATCH 07/21] Replace hibernate NullPrecedence with jpa Nulls RISDEV-10437 --- .../PostgresDocumentationUnitSearchRepositoryImpl.java | 10 ++++------ .../jpa/PostgresEurLexResultRepositoryImpl.java | 4 ++-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitSearchRepositoryImpl.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitSearchRepositoryImpl.java index c0bdc1f636..cbb443917d 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitSearchRepositoryImpl.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitSearchRepositoryImpl.java @@ -18,6 +18,7 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Expression; import jakarta.persistence.criteria.Join; +import jakarta.persistence.criteria.Nulls; import jakarta.persistence.criteria.Order; import jakarta.persistence.criteria.Path; import jakarta.persistence.criteria.Predicate; @@ -35,7 +36,6 @@ import java.util.UUID; import lombok.Builder; import lombok.extern.slf4j.Slf4j; -import org.hibernate.query.NullPrecedence; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.query.criteria.JpaPredicate; import org.jetbrains.annotations.NotNull; @@ -564,14 +564,12 @@ private List getOrderCriteria( if (parameters.scheduledOnly || parameters.handoverDate.isPresent()) { orderCriteria.add( cb.desc(root.get(DocumentationUnitDTO_.scheduledPublicationDateTime)) - .nullPrecedence(NullPrecedence.LAST)); + .nullPrecedence(Nulls.LAST)); orderCriteria.add( - cb.desc(root.get(DocumentationUnitDTO_.lastHandoverDateTime)) - .nullPrecedence(NullPrecedence.LAST)); + cb.desc(root.get(DocumentationUnitDTO_.lastHandoverDateTime)).nullPrecedence(Nulls.LAST)); } - orderCriteria.add( - cb.desc(root.get(DocumentationUnitDTO_.date)).nullPrecedence(NullPrecedence.LAST)); + orderCriteria.add(cb.desc(root.get(DocumentationUnitDTO_.date)).nullPrecedence(Nulls.LAST)); orderCriteria.add(cb.desc(root.get(DocumentationUnitDTO_.documentNumber))); return orderCriteria; } diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresEurLexResultRepositoryImpl.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresEurLexResultRepositoryImpl.java index ee8ebaa6f8..893fda0650 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresEurLexResultRepositoryImpl.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresEurLexResultRepositoryImpl.java @@ -8,6 +8,7 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Join; import jakarta.persistence.criteria.JoinType; +import jakarta.persistence.criteria.Nulls; import jakarta.persistence.criteria.Order; import jakarta.persistence.criteria.Predicate; import jakarta.persistence.criteria.Root; @@ -16,7 +17,6 @@ import java.util.List; import java.util.Optional; import org.apache.logging.log4j.util.Strings; -import org.hibernate.query.NullPrecedence; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; @@ -60,7 +60,7 @@ public Page findAllNewWithUriBySearchParameters( // Order by updatedAt with nulls last, then by created at and finally by decision date. List dateTimeDescOrder = List.of( - builder.desc(root.get(EurLexResultDTO_.updatedAt)).nullPrecedence(NullPrecedence.LAST), + builder.desc(root.get(EurLexResultDTO_.updatedAt)).nullPrecedence(Nulls.LAST), builder.desc(root.get(EurLexResultDTO_.createdAt)), builder.desc(root.get(EurLexResultDTO_.date))); builderQuery.orderBy(dateTimeDescOrder); From 0bdcdc55eadcc0df61d241668f69f985548f6801 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Fri, 21 Nov 2025 16:48:47 +0100 Subject: [PATCH 08/21] Adjust spring module names RISDEV-10437 --- backend/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 15c1a5f073..b5419bd6d4 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -153,7 +153,7 @@ sonar { dependencies { val testContainersVersion = "2.0.2" - implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-webmvc") implementation("org.springframework.boot:spring-boot-starter-actuator") implementation("org.springframework.boot:spring-boot-starter-data-redis") implementation("org.springframework.boot:spring-boot-starter-data-jpa") @@ -161,7 +161,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-autoconfigure") implementation("org.springframework.session:spring-session-data-redis") implementation("org.springframework.boot:spring-boot-starter-security") - implementation("org.springframework.boot:spring-boot-starter-oauth2-client") { + implementation("org.springframework.boot:spring-boot-starter-security-oauth2-client") { exclude(group = "net.minidev", module = "json-smart") } implementation("org.springframework.security:spring-security-oauth2-resource-server:7.0.0") From a13c043a3d02d6efcf6a2d190ebc666ead6da174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Fri, 21 Nov 2025 16:49:36 +0100 Subject: [PATCH 09/21] Fix test dependencies RISDEV-10437 --- backend/build.gradle.kts | 9 +++++++++ .../ris/caselaw/adapter/AdminControllerTest.java | 2 +- .../ris/caselaw/adapter/AppealOptionsControllerTest.java | 2 +- .../CollectiveAgreementIndustryControllerTest.java | 2 +- .../ris/caselaw/adapter/CourtControllerTest.java | 2 +- .../ris/caselaw/adapter/CurrencyCodeControllerTest.java | 2 +- .../ris/caselaw/adapter/DocumentTypeControllerTest.java | 2 +- .../caselaw/adapter/DocumentationUnitControllerTest.java | 2 +- .../DocumentationUnitHistoryLogControllerTest.java | 2 +- .../ris/caselaw/adapter/FieldOfLawControllerTest.java | 2 +- .../ris/caselaw/adapter/LanguageCodeControllerTest.java | 2 +- .../adapter/LegalPeriodicalEditionControllerTest.java | 2 +- .../ris/caselaw/adapter/UserControllerTest.java | 2 +- .../DocumentationUnitControllerAuthTest.java | 2 +- .../ris/caselaw/adapter/eurlex/EurLexControllerTest.java | 2 +- .../caselaw/integration/tests/BaseIntegrationTest.java | 2 +- 16 files changed, 24 insertions(+), 15 deletions(-) diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index b5419bd6d4..c777cc2bc1 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -240,6 +240,15 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-starter-test") { exclude(group = "org.mockito", module = "mockito-core") } + + testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test") + testImplementation("org.springframework.boot:spring-boot-starter-actuator-test") + testImplementation("org.springframework.boot:spring-boot-starter-data-redis-test") + testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test") + testImplementation("org.springframework.boot:spring-boot-starter-validation-test") + testImplementation("org.springframework.boot:spring-boot-starter-security-test") + testImplementation("org.springframework.boot:spring-boot-starter-security-oauth2-client-test") + testImplementation("org.springframework.boot:spring-boot-starter-flyway-test") testImplementation("org.mockito:mockito-junit-jupiter:5.21.0") testImplementation("org.mockito:mockito-inline:5.2.0") diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AdminControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AdminControllerTest.java index 839eac5d1e..7a48bf93aa 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AdminControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AdminControllerTest.java @@ -16,7 +16,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AppealOptionsControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AppealOptionsControllerTest.java index bfec7f64a8..9ddf1bb513 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AppealOptionsControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AppealOptionsControllerTest.java @@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CollectiveAgreementIndustryControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CollectiveAgreementIndustryControllerTest.java index b8c9f86336..e942deea02 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CollectiveAgreementIndustryControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CollectiveAgreementIndustryControllerTest.java @@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CourtControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CourtControllerTest.java index 612cb24977..063c60c89a 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CourtControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CourtControllerTest.java @@ -14,7 +14,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CurrencyCodeControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CurrencyCodeControllerTest.java index b78daafd1b..2da950f1c8 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CurrencyCodeControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/CurrencyCodeControllerTest.java @@ -14,7 +14,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentTypeControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentTypeControllerTest.java index 3364d0eb11..87352f5c27 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentTypeControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentTypeControllerTest.java @@ -19,7 +19,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java index dc12f7eee7..3a51603cf1 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java @@ -93,7 +93,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitHistoryLogControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitHistoryLogControllerTest.java index a327ea6d1e..897b446302 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitHistoryLogControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitHistoryLogControllerTest.java @@ -38,7 +38,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/FieldOfLawControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/FieldOfLawControllerTest.java index e9bf1031f3..28c8eac6f0 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/FieldOfLawControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/FieldOfLawControllerTest.java @@ -11,7 +11,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/LanguageCodeControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/LanguageCodeControllerTest.java index 4558171cf8..c17401000a 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/LanguageCodeControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/LanguageCodeControllerTest.java @@ -14,7 +14,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/LegalPeriodicalEditionControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/LegalPeriodicalEditionControllerTest.java index 7e0aa4bec0..09893fdded 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/LegalPeriodicalEditionControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/LegalPeriodicalEditionControllerTest.java @@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/UserControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/UserControllerTest.java index 322965613e..4327d8b2c1 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/UserControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/UserControllerTest.java @@ -26,7 +26,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/authorization/DocumentationUnitControllerAuthTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/authorization/DocumentationUnitControllerAuthTest.java index 6baaa46efe..4427c427d3 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/authorization/DocumentationUnitControllerAuthTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/authorization/DocumentationUnitControllerAuthTest.java @@ -46,7 +46,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/eurlex/EurLexControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/eurlex/EurLexControllerTest.java index de928350b4..cc8b52fc12 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/eurlex/EurLexControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/eurlex/EurLexControllerTest.java @@ -20,7 +20,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.data.domain.Page; import org.springframework.security.oauth2.core.oidc.user.OidcUser; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java index 26985839af..2b20e1360d 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java @@ -17,8 +17,8 @@ import org.junit.jupiter.api.Tag; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.context.annotation.Import; import org.springframework.core.io.ClassPathResource; import org.springframework.jdbc.datasource.init.ScriptUtils; From 3c67ff35cb9970355cb89927d9d6f4e6eb550835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Fri, 21 Nov 2025 17:02:54 +0100 Subject: [PATCH 10/21] Add missing MockitoExtension RISDEV-10437 --- .../ris/caselaw/adapter/DocxConverterServiceTest.java | 2 ++ .../adapter/JurisXmlExporterResponseProcessorTest.java | 5 +++++ .../ris/caselaw/domain/DocumentationUnitServiceTest.java | 2 ++ 3 files changed, 9 insertions(+) diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocxConverterServiceTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocxConverterServiceTest.java index 40c4acba89..8c2f0e64ae 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocxConverterServiceTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocxConverterServiceTest.java @@ -76,6 +76,7 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockedStatic; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Import; @@ -89,6 +90,7 @@ import software.amazon.awssdk.services.s3.model.GetObjectResponse; @ExtendWith(SpringExtension.class) +@ExtendWith(MockitoExtension.class) @Import({DocxConverterService.class, ConverterConfig.class}) class DocxConverterServiceTest { diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/JurisXmlExporterResponseProcessorTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/JurisXmlExporterResponseProcessorTest.java index 9fad10b957..ae26bf9cb5 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/JurisXmlExporterResponseProcessorTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/JurisXmlExporterResponseProcessorTest.java @@ -57,11 +57,16 @@ import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; import org.springframework.context.annotation.Import; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; @ExtendWith(SpringExtension.class) +@ExtendWith(MockitoExtension.class) +@MockitoSettings(strictness = Strictness.LENIENT) @Import({JurisXmlExporterResponseProcessor.class, JurisMessageWrapperFactory.class}) class JurisXmlExporterResponseProcessorTest { private static final String DOCUMENT_NUMBER = "KORE123456789"; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/domain/DocumentationUnitServiceTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/domain/DocumentationUnitServiceTest.java index 6b0091095a..c3e09aa9d5 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/domain/DocumentationUnitServiceTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/domain/DocumentationUnitServiceTest.java @@ -58,6 +58,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.context.annotation.Import; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; @@ -68,6 +69,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; @ExtendWith(SpringExtension.class) +@ExtendWith(MockitoExtension.class) @Import({DocumentationUnitService.class, DatabaseDocumentationUnitStatusService.class}) class DocumentationUnitServiceTest { private static final UUID TEST_UUID = UUID.fromString("88888888-4444-4444-4444-121212121212"); From de1a881f5cc4210afae345f67b306c56e9e7ae56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Fri, 21 Nov 2025 17:17:43 +0100 Subject: [PATCH 11/21] Update to jackson 3 * Replace ObjectMapper with JsonMapper * Remove no longer needed json converters * Remove jsr310 time * Adjust jackson imports We need to use Jackson 2 for the patch imports but want to use Jackson 3 for everything else RISDEV-10437 --- backend/build.gradle.kts | 7 ++++--- .../adapter/JurisXmlExporterWrapper.java | 2 +- .../adapter/PortalPublicationService.java | 2 +- .../ris/caselaw/config/ConverterConfig.java | 20 ++++++++++++------- .../caselaw/config/WebMvcConfiguration.java | 12 +++++------ .../ris/caselaw/config/YearDeserializer.java | 15 -------------- .../ris/caselaw/config/YearJsonConverter.java | 17 ---------------- .../ris/caselaw/config/YearSerializer.java | 16 --------------- .../ris/caselaw/domain/court/CourtXML.java | 2 +- .../ris/caselaw/domain/court/CourtsXML.java | 4 ++-- backend/src/main/resources/application.yaml | 2 +- .../ris/caselaw/TestConfig.java | 10 ++++------ .../adapter/AppealOptionsControllerTest.java | 2 +- .../DocumentationUnitControllerTest.java | 2 +- ...mentationUnitHistoryLogControllerTest.java | 2 +- .../adapter/PortalPublicationServiceTest.java | 13 ++++++------ .../caselaw/adapter/UserControllerTest.java | 2 +- .../ris/caselaw/adapter/XmlExporterTest.java | 2 +- .../tests/BaseIntegrationTest.java | 5 ++++- .../tests/DocumentTypeIntegrationTest.java | 2 +- .../DocumentationOfficeIntegrationTest.java | 2 +- ...tionUnitControllerAuthIntegrationTest.java | 2 +- ...entationUnitHistoryLogIntegrationTest.java | 2 +- ...tHistoryLogProcessStepIntegrationTest.java | 2 +- .../DocumentationUnitIntegrationTest.java | 2 +- ...ocumentationUnitSearchIntegrationTest.java | 2 +- .../tests/EurLexResultIntegrationTest.java | 2 +- .../tests/FieldOfLawIntegrationTest.java | 2 +- .../tests/HandoverMailIntegrationTest.java | 2 +- ...urisXmlExporterWrapperIntegrationTest.java | 9 +++------ .../PreviousDecisionIntegrationTest.java | 2 +- .../tests/ProcedureIntegrationTest.java | 2 +- .../tests/ProcessStepIntegrationTest.java | 2 +- .../caselaw/webtestclient/RisBodySpec.java | 4 ++-- .../caselaw/webtestclient/RisRequestSpec.java | 6 +++--- .../webtestclient/RisResponseSpec.java | 4 ++-- .../webtestclient/RisWebTestClient.java | 2 +- 37 files changed, 73 insertions(+), 115 deletions(-) delete mode 100644 backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearDeserializer.java delete mode 100644 backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearJsonConverter.java delete mode 100644 backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearSerializer.java diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index c777cc2bc1..5c823ffa1b 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -210,10 +210,11 @@ dependencies { // for local development: // implementation(files("../../ris-data-migration/schema/build/libs/schema-0.0.118.jar")) - implementation("com.fasterxml.jackson.core:jackson-core:2.20.1") - implementation("com.fasterxml.jackson.core:jackson-databind:2.20.1") + implementation("tools.jackson.core:jackson-core:3.0.2") + implementation("tools.jackson.core:jackson-databind:3.0.2") implementation("com.fasterxml.jackson.core:jackson-annotations:2.20") - implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.20.1") + implementation("tools.jackson.dataformat:jackson-dataformat-xml:3.0.2") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.20.1") implementation("com.gravity9:json-patch-path:2.0.2") diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/JurisXmlExporterWrapper.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/JurisXmlExporterWrapper.java index bf1d8e69b4..5fddd306df 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/JurisXmlExporterWrapper.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/JurisXmlExporterWrapper.java @@ -1,6 +1,5 @@ package de.bund.digitalservice.ris.caselaw.adapter; -import com.fasterxml.jackson.databind.ObjectMapper; import de.bund.digitalservice.ris.caselaw.domain.Decision; import de.bund.digitalservice.ris.caselaw.domain.LegalPeriodicalEdition; import de.bund.digitalservice.ris.caselaw.domain.Reference; @@ -14,6 +13,7 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; +import tools.jackson.databind.ObjectMapper; /** Wraps the Juris XML exporter to provide a common interface for XML export. */ public class JurisXmlExporterWrapper implements XmlExporter { diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationService.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationService.java index 9d78215d92..2854b478d3 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationService.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationService.java @@ -1,6 +1,5 @@ package de.bund.digitalservice.ris.caselaw.adapter; -import com.fasterxml.jackson.databind.ObjectMapper; import de.bund.digitalservice.ris.caselaw.adapter.caselawldml.CaseLawLdml; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.AttachmentDTO; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.AttachmentRepository; @@ -30,6 +29,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.data.mapping.MappingException; import org.springframework.stereotype.Service; +import tools.jackson.databind.ObjectMapper; @Service @Slf4j diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java index f25fdbdedd..f04c35698c 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java @@ -16,6 +16,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; +import tools.jackson.databind.json.JsonMapper; @Configuration public class ConverterConfig { @@ -57,17 +58,22 @@ public TransformerFactory transformerFactory() { @Bean @Primary - public ObjectMapper objectMapper() { - var objectMapper = new ObjectMapper(); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - objectMapper.registerModule(YearJsonConverter.yearJsonConverter()); - return objectMapper; + public JsonMapper jsonMapper() { + return JsonMapper.builder().build(); } @Bean public XmlExporter jurisXmlExporter() { - return new JurisXmlExporterWrapper(objectMapper(), transformerFactory()); + return new JurisXmlExporterWrapper(jsonMapper(), transformerFactory()); + } + + @Bean + @Primary + public ObjectMapper legacyObjectMapper() { + var objectMapper = new ObjectMapper(); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.registerModule(new JavaTimeModule()); + return objectMapper; } // @Bean diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/WebMvcConfiguration.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/WebMvcConfiguration.java index 9ab73d1275..c62a8e208b 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/WebMvcConfiguration.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/WebMvcConfiguration.java @@ -1,6 +1,5 @@ package de.bund.digitalservice.ris.caselaw.config; -import com.fasterxml.jackson.databind.ObjectMapper; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -9,22 +8,23 @@ import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import tools.jackson.databind.json.JsonMapper; @Configuration public class WebMvcConfiguration implements WebMvcConfigurer { - private final ObjectMapper objectMapper; + private final JsonMapper jsonMapper; - public WebMvcConfiguration(ObjectMapper objectMapper) { - this.objectMapper = objectMapper; + public WebMvcConfiguration(JsonMapper jsonMapper) { + this.jsonMapper = jsonMapper; } @Override public void configureMessageConverters(List> converters) { converters.add(byteArrayHttpMessageConverter()); converters.add(stringHttpMessageConverter()); - converters.add(new MappingJackson2HttpMessageConverter(objectMapper)); + converters.add(new JacksonJsonHttpMessageConverter(jsonMapper)); } private StringHttpMessageConverter stringHttpMessageConverter() { diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearDeserializer.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearDeserializer.java deleted file mode 100644 index c9a3bd0f26..0000000000 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearDeserializer.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.bund.digitalservice.ris.caselaw.config; - -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.databind.DeserializationContext; -import com.fasterxml.jackson.databind.JsonDeserializer; -import java.io.IOException; -import java.time.Year; - -public class YearDeserializer extends JsonDeserializer { - @Override - public Year deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) - throws IOException { - return Year.parse(jsonParser.getText()); - } -} diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearJsonConverter.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearJsonConverter.java deleted file mode 100644 index aa6bc9ef0d..0000000000 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearJsonConverter.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.bund.digitalservice.ris.caselaw.config; - -import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.datatype.jsr310.deser.YearDeserializer; -import java.time.Year; -import lombok.experimental.UtilityClass; - -@UtilityClass -public class YearJsonConverter { - - public static SimpleModule yearJsonConverter() { - SimpleModule yearModule = new SimpleModule(); - yearModule.addSerializer(Year.class, new YearSerializer()); - yearModule.addDeserializer(Year.class, new YearDeserializer()); - return yearModule; - } -} diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearSerializer.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearSerializer.java deleted file mode 100644 index 0dc3959c81..0000000000 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/YearSerializer.java +++ /dev/null @@ -1,16 +0,0 @@ -package de.bund.digitalservice.ris.caselaw.config; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; -import java.io.IOException; -import java.time.Year; - -public class YearSerializer extends JsonSerializer { - @Override - public void serialize( - Year year, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) - throws IOException { - jsonGenerator.writeString(year.toString()); - } -} diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtXML.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtXML.java index 0da1a522fc..4d9871d4bd 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtXML.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtXML.java @@ -2,8 +2,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import lombok.Data; +import tools.jackson.dataformat.xml.annotation.JacksonXmlProperty; @Data @JsonIgnoreProperties(value = {"synonym", "spruchkoerper"}) diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtsXML.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtsXML.java index aa2ecf5f8a..d86f56732d 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtsXML.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtsXML.java @@ -1,10 +1,10 @@ package de.bund.digitalservice.ris.caselaw.domain.court; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import java.util.List; import lombok.Data; +import tools.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; +import tools.jackson.dataformat.xml.annotation.JacksonXmlRootElement; @Data @JacksonXmlRootElement(localName = "juris-table") diff --git a/backend/src/main/resources/application.yaml b/backend/src/main/resources/application.yaml index 17b9abfb62..606f7ef091 100644 --- a/backend/src/main/resources/application.yaml +++ b/backend/src/main/resources/application.yaml @@ -16,7 +16,7 @@ management: show-details: always group: readiness: - include: readinessState,redis,db + include: readinessState,db # TODO: (Malte Laukötter, 2025-12-15) readd redis endpoints: web: exposure: diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/TestConfig.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/TestConfig.java index fdfd3cef92..2215de02aa 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/TestConfig.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/TestConfig.java @@ -1,21 +1,19 @@ package de.bund.digitalservice.ris.caselaw; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import de.bund.digitalservice.ris.caselaw.webtestclient.RisWebTestClient; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.test.web.servlet.MockMvc; +import tools.jackson.databind.json.JsonMapper; @TestConfiguration public class TestConfig { @Bean public RisWebTestClient risWebTestClient(MockMvc mockMvc) { - var objectMapper = new ObjectMapper(); - objectMapper.registerModule(new JavaTimeModule()); + /* var objectMapper = new ObjectMapper(); objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.registerModule(new JavaTimeModule());*/ - return new RisWebTestClient(mockMvc, objectMapper); + return new RisWebTestClient(mockMvc, JsonMapper.builder().build()); } } diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AppealOptionsControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AppealOptionsControllerTest.java index 9ddf1bb513..1c05344e99 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AppealOptionsControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/AppealOptionsControllerTest.java @@ -3,7 +3,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.TestConfig; import de.bund.digitalservice.ris.caselaw.config.SecurityConfig; import de.bund.digitalservice.ris.caselaw.domain.appeal.AppealStatus; @@ -19,6 +18,7 @@ import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; +import tools.jackson.core.type.TypeReference; @ExtendWith(SpringExtension.class) @WebMvcTest(controllers = AppealOptionsController.class) diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java index 3a51603cf1..ec8ae359d7 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java @@ -13,7 +13,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.TextNode; @@ -105,6 +104,7 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUser; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; +import tools.jackson.core.type.TypeReference; @ExtendWith(SpringExtension.class) @WebMvcTest(controllers = DocumentationUnitController.class) diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitHistoryLogControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitHistoryLogControllerTest.java index 897b446302..d085bc7df1 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitHistoryLogControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitHistoryLogControllerTest.java @@ -10,7 +10,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.TestConfig; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseApiKeyRepository; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationOfficeRepository; @@ -45,6 +44,7 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUser; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; +import tools.jackson.core.type.TypeReference; @ExtendWith(SpringExtension.class) @WebMvcTest(controllers = DocumentationUnitHistoryLogController.class) diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationServiceTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationServiceTest.java index 7aeb6b5e3b..42879762b4 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationServiceTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationServiceTest.java @@ -17,7 +17,6 @@ import static org.mockito.Mockito.when; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import de.bund.digitalservice.ris.caselaw.adapter.caselawldml.CaseLawLdml; import de.bund.digitalservice.ris.caselaw.adapter.caselawldml.FrbrElement; import de.bund.digitalservice.ris.caselaw.adapter.caselawldml.FrbrThis; @@ -63,6 +62,8 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; @ExtendWith(SpringExtension.class) class PortalPublicationServiceTest { @@ -439,7 +440,7 @@ void publishDocumentationUnitWithChangeLog_withFeatureDisabled_shouldNotPublish( @DisplayName("Should fail when changelog file cannot be created") void publishDocumentationUnitWithChangeLog_withChangelogFileCreationError_shouldThrowPublishException() - throws DocumentationUnitNotExistsException, JsonProcessingException { + throws DocumentationUnitNotExistsException, JacksonException { UUID documentationUnitId = UUID.randomUUID(); User user = mock(User.class); when(documentationUnitRepository.findByUuid(documentationUnitId)) @@ -449,7 +450,7 @@ void publishDocumentationUnitWithChangeLog_withFeatureDisabled_shouldNotPublish( when(caseLawBucket.getAllFilenamesByPath(testDocumentUnit.documentNumber() + "/")) .thenReturn(new ArrayList<>(), List.of(withPrefix(testDocumentNumber))); - when(objectMapper.writeValueAsString(any())).thenThrow(JsonProcessingException.class); + when(objectMapper.writeValueAsString(any())).thenThrow(JacksonException.class); assertThatExceptionOfType(PublishException.class) .isThrownBy( @@ -688,8 +689,8 @@ void withdrawWithChangelog_withBucketException_shouldThrowPublishException() } @Test - void withdrawWithChangelog_withJsonProcessingException_shouldThrowChangelogException() - throws DocumentationUnitNotExistsException, JsonProcessingException { + void withdrawWithChangelog_withJacksonException_shouldThrowChangelogException() + throws DocumentationUnitNotExistsException, JacksonException { UUID uuid = UUID.randomUUID(); Decision decision = Decision.builder() @@ -701,7 +702,7 @@ void withdrawWithChangelog_withJsonProcessingException_shouldThrowChangelogExcep when(caseLawBucket.getAllFilenamesByPath(testDocumentNumber + "/")) .thenReturn(List.of(withPrefix(testDocumentNumber))); User user = mock(User.class); - when(objectMapper.writeValueAsString(any())).thenThrow(JsonProcessingException.class); + when(objectMapper.writeValueAsString(any())).thenThrow(JacksonException.class); assertThatExceptionOfType(ChangelogException.class) .isThrownBy(() -> subject.withdrawDocumentationUnitWithChangelog(uuid, user)) diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/UserControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/UserControllerTest.java index 4327d8b2c1..487491a914 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/UserControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/UserControllerTest.java @@ -8,7 +8,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.TestConfig; import de.bund.digitalservice.ris.caselaw.config.SecurityConfig; import de.bund.digitalservice.ris.caselaw.domain.User; @@ -34,6 +33,7 @@ import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import org.springframework.test.context.junit.jupiter.SpringExtension; +import tools.jackson.core.type.TypeReference; @ExtendWith(SpringExtension.class) @WebMvcTest(controllers = UserController.class) diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/XmlExporterTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/XmlExporterTest.java index ad415f6ba1..759eafe262 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/XmlExporterTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/XmlExporterTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.databind.ObjectMapper; import de.bund.digitalservice.ris.caselaw.config.ConverterConfig; import de.bund.digitalservice.ris.caselaw.domain.ActiveCitation; import de.bund.digitalservice.ris.caselaw.domain.CollectiveAgreement; @@ -40,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Import; import org.springframework.test.context.junit.jupiter.SpringExtension; +import tools.jackson.databind.ObjectMapper; @ExtendWith(SpringExtension.class) @Import({ConverterConfig.class}) diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java index 2b20e1360d..54db077815 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java @@ -49,7 +49,10 @@ "management.endpoint.health.probes.enabled=true", "management.health.livenessState.enabled=true", "management.health.readinessState.enabled=true", - "management.endpoint.health.group.readiness.include=readinessState,db,redis", + "management.endpoint.health.group.readiness.include=readinessState,db", // TODO: (Malte + // Laukötter, + // 2025-12-15) include + // redis again "spring.security.oauth2.client.provider.keycloak.issuer-uri=localhost", }) @AutoConfigureMockMvc diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentTypeIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentTypeIntegrationTest.java index aabf80baa0..2c7bbef3bc 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentTypeIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentTypeIntegrationTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentTypeRepository; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DocumentTypeDTO; import de.bund.digitalservice.ris.caselaw.adapter.transformer.DocumentTypeTransformer; @@ -15,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; +import tools.jackson.core.type.TypeReference; @Sql( scripts = {"classpath:document_types.sql"}, diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationOfficeIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationOfficeIntegrationTest.java index eb4322020c..4e3f107322 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationOfficeIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationOfficeIntegrationTest.java @@ -2,13 +2,13 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationOfficeRepository; import de.bund.digitalservice.ris.caselaw.domain.DocumentationOffice; import de.bund.digitalservice.ris.caselaw.webtestclient.RisWebTestClient; import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import tools.jackson.core.type.TypeReference; class DocumentationOfficeIntegrationTest extends BaseIntegrationTest { diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitControllerAuthIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitControllerAuthIntegrationTest.java index 70196e0aa6..f5853bb24a 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitControllerAuthIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitControllerAuthIntegrationTest.java @@ -5,7 +5,6 @@ import static de.bund.digitalservice.ris.caselaw.domain.PublicationStatus.UNPUBLISHED; import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.EntityBuilderTestUtil; import de.bund.digitalservice.ris.caselaw.SliceTestImpl; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationOfficeRepository; @@ -32,6 +31,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Slice; +import tools.jackson.core.type.TypeReference; class DocumentationUnitControllerAuthIntegrationTest extends BaseIntegrationTest { diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitHistoryLogIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitHistoryLogIntegrationTest.java index c7b6566840..8ce7f1c42a 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitHistoryLogIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitHistoryLogIntegrationTest.java @@ -4,7 +4,6 @@ import static de.bund.digitalservice.ris.caselaw.AuthUtils.buildDSDocOffice; import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.EntityBuilderTestUtil; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationOfficeRepository; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationUnitHistoryLogRepository; @@ -34,6 +33,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; +import tools.jackson.core.type.TypeReference; class DocumentationUnitHistoryLogIntegrationTest extends BaseIntegrationTest { @Autowired private RisWebTestClient risWebTestClient; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitHistoryLogProcessStepIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitHistoryLogProcessStepIntegrationTest.java index 876aed7c75..42a79515cc 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitHistoryLogProcessStepIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitHistoryLogProcessStepIntegrationTest.java @@ -4,7 +4,6 @@ import static de.bund.digitalservice.ris.caselaw.AuthUtils.buildDSDocOffice; import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.EntityBuilderTestUtil; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationOfficeRepository; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationUnitHistoryLogRepository; @@ -35,6 +34,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; +import tools.jackson.core.type.TypeReference; class DocumentationUnitHistoryLogProcessStepIntegrationTest extends BaseIntegrationTest { @Autowired private RisWebTestClient risWebTestClient; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitIntegrationTest.java index 70061b1df3..ce9ba9c177 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitIntegrationTest.java @@ -9,7 +9,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.EntityBuilderTestUtil; import de.bund.digitalservice.ris.caselaw.SliceTestImpl; import de.bund.digitalservice.ris.caselaw.adapter.DocumentNumberPatternConfig; @@ -125,6 +124,7 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.util.DefaultUriBuilderFactory; +import tools.jackson.core.type.TypeReference; @Sql(scripts = {"classpath:courts_init.sql"}) @Sql( diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitSearchIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitSearchIntegrationTest.java index c20c59131d..9af898d400 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitSearchIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/DocumentationUnitSearchIntegrationTest.java @@ -4,7 +4,6 @@ import static org.assertj.core.groups.Tuple.tuple; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.EntityBuilderTestUtil; import de.bund.digitalservice.ris.caselaw.SliceTestImpl; import de.bund.digitalservice.ris.caselaw.adapter.DatabaseDuplicateCheckService; @@ -40,6 +39,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Slice; import org.springframework.test.context.jdbc.Sql; +import tools.jackson.core.type.TypeReference; @Sql(scripts = {"classpath:courts_init.sql"}) @Sql( diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/EurLexResultIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/EurLexResultIntegrationTest.java index 4cefd07b5c..7b3cc934b0 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/EurLexResultIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/EurLexResultIntegrationTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.PageTestImpl; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseEurLexResultRepository; import de.bund.digitalservice.ris.caselaw.adapter.eurlex.EurLexResultRepository; @@ -15,6 +14,7 @@ import org.springframework.data.domain.Page; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; +import tools.jackson.core.type.TypeReference; @Sql( scripts = {"classpath:eurlex_init.sql"}, diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/FieldOfLawIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/FieldOfLawIntegrationTest.java index c52f575b8d..17024052e2 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/FieldOfLawIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/FieldOfLawIntegrationTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.SliceTestImpl; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseFieldOfLawRepository; import de.bund.digitalservice.ris.caselaw.domain.lookuptable.fieldoflaw.FieldOfLaw; @@ -15,6 +14,7 @@ import org.springframework.data.domain.Slice; import org.springframework.test.context.jdbc.Sql; import org.springframework.test.context.jdbc.Sql.ExecutionPhase; +import tools.jackson.core.type.TypeReference; @Sql( scripts = {"classpath:fields_of_law_init.sql"}, diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/HandoverMailIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/HandoverMailIntegrationTest.java index 01e5cc6066..aa50446ca7 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/HandoverMailIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/HandoverMailIntegrationTest.java @@ -6,7 +6,6 @@ import static org.mockito.Mockito.when; import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.AFTER_TEST_METHOD; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.EntityBuilderTestUtil; import de.bund.digitalservice.ris.caselaw.adapter.MockXmlExporter; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationOfficeRepository; @@ -62,6 +61,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Import; import org.springframework.test.context.jdbc.Sql; +import tools.jackson.core.type.TypeReference; @Sql(scripts = {"classpath:legal_periodical_init.sql"}) @Sql( diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/JurisXmlExporterWrapperIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/JurisXmlExporterWrapperIntegrationTest.java index 74fa10c992..48e9b09f32 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/JurisXmlExporterWrapperIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/JurisXmlExporterWrapperIntegrationTest.java @@ -2,9 +2,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import de.bund.digitalservice.ris.caselaw.domain.CoreData; import de.bund.digitalservice.ris.caselaw.domain.Decision; import de.bund.digitalservice.ris.caselaw.domain.LongTexts; @@ -20,6 +17,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.json.JsonMapper; @Tag("integration") class JurisXmlExporterWrapperIntegrationTest { @@ -32,9 +31,7 @@ class JurisXmlExporterWrapperIntegrationTest { @BeforeEach void setUp() { - objectMapper = new ObjectMapper(); - objectMapper.registerModule(new JavaTimeModule()); - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper = JsonMapper.builder().build(); } @Test diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/PreviousDecisionIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/PreviousDecisionIntegrationTest.java index 6f921179af..919d9e1c93 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/PreviousDecisionIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/PreviousDecisionIntegrationTest.java @@ -3,7 +3,6 @@ import static de.bund.digitalservice.ris.caselaw.AuthUtils.buildDSDocOffice; import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.EntityBuilderTestUtil; import de.bund.digitalservice.ris.caselaw.SliceTestImpl; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.CourtDTO; @@ -44,6 +43,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import tools.jackson.core.type.TypeReference; class PreviousDecisionIntegrationTest extends BaseIntegrationTest { diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/ProcedureIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/ProcedureIntegrationTest.java index 1ed659c9f4..913cfdfbd9 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/ProcedureIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/ProcedureIntegrationTest.java @@ -5,7 +5,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.AFTER_TEST_METHOD; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.SliceTestImpl; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationOfficeRepository; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationUnitRepository; @@ -34,6 +33,7 @@ import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.jdbc.Sql; +import tools.jackson.core.type.TypeReference; @Sql( scripts = { diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/ProcessStepIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/ProcessStepIntegrationTest.java index 615ad3034e..146eaecb35 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/ProcessStepIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/ProcessStepIntegrationTest.java @@ -3,7 +3,6 @@ import static de.bund.digitalservice.ris.caselaw.AuthUtils.buildBGHDocOffice; import static org.assertj.core.api.Assertions.assertThat; -import com.fasterxml.jackson.core.type.TypeReference; import de.bund.digitalservice.ris.caselaw.EntityBuilderTestUtil; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationOfficeRepository; import de.bund.digitalservice.ris.caselaw.adapter.database.jpa.DatabaseDocumentationUnitProcessStepRepository; @@ -28,6 +27,7 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.util.DefaultUriBuilderFactory; +import tools.jackson.core.type.TypeReference; @Transactional class ProcessStepIntegrationTest extends BaseIntegrationTest { diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisBodySpec.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisBodySpec.java index 0704d9dd22..cd2d5f52ea 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisBodySpec.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisBodySpec.java @@ -1,13 +1,13 @@ package de.bund.digitalservice.ris.caselaw.webtestclient; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import de.bund.digitalservice.ris.caselaw.integration.tests.RisEntityExchangeResult; import java.nio.charset.StandardCharsets; import java.util.function.Consumer; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.NotImplementedException; import org.springframework.test.web.servlet.ResultActions; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; @Slf4j public class RisBodySpec { diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisRequestSpec.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisRequestSpec.java index 353bd14a9c..1625f5238a 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisRequestSpec.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisRequestSpec.java @@ -2,8 +2,6 @@ import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.Cookie; import java.net.URI; import java.util.Objects; @@ -16,6 +14,8 @@ import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.web.util.UriComponentsBuilder; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; public class RisRequestSpec { private final MockMvc mockMvc; @@ -132,7 +132,7 @@ public RisResponseSpec exchange() { try { String jsonString = objectMapper.writeValueAsString(bodySupplier.get()); request.content(jsonString); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException(e); } } else if (json != null) { diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisResponseSpec.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisResponseSpec.java index 3d0dee08f3..f9ec995073 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisResponseSpec.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisResponseSpec.java @@ -1,8 +1,8 @@ package de.bund.digitalservice.ris.caselaw.webtestclient; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.test.web.servlet.ResultActions; +import tools.jackson.core.type.TypeReference; +import tools.jackson.databind.ObjectMapper; public class RisResponseSpec { private final ResultActions resultActions; diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisWebTestClient.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisWebTestClient.java index 4f944561e1..0c1b24165f 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisWebTestClient.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/webtestclient/RisWebTestClient.java @@ -4,7 +4,6 @@ import static de.bund.digitalservice.ris.caselaw.AuthUtils.getMockLoginExternal; import static de.bund.digitalservice.ris.caselaw.AuthUtils.getMockLoginWithDocOffice; -import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.Cookie; import java.util.UUID; import org.springframework.test.web.servlet.MockMvc; @@ -12,6 +11,7 @@ import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.testcontainers.shaded.org.checkerframework.checker.nullness.qual.Nullable; +import tools.jackson.databind.ObjectMapper; public class RisWebTestClient { private final MockMvc mockMvc; From 529ee539dd35a974e633ccacb9e8fab3e7ecf92e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Mon, 15 Dec 2025 14:41:00 +0100 Subject: [PATCH 12/21] Parse JsonPatch using jackson 2 The library we use for json patch support does not support Jackson 3 yet Therefore, we created a Serializer and Deserializer that call the Jackson 2 ObjectMapper for the JsonPatch class. RISDEV-10437 --- .../ris/caselaw/config/ConverterConfig.java | 12 ++++++- .../caselaw/config/JsonPatchDeserializer.java | 33 +++++++++++++++++++ .../caselaw/config/JsonPatchSerializer.java | 33 +++++++++++++++++++ .../caselaw/config/WebMvcConfiguration.java | 11 ++++--- ...DocumentationUnitControllerTestConfig.java | 2 ++ .../ris/caselaw/TestConfig.java | 19 ++++++++--- .../DocumentationUnitControllerTest.java | 2 -- 7 files changed, 100 insertions(+), 12 deletions(-) create mode 100644 backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchDeserializer.java create mode 100644 backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchSerializer.java diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java index f04c35698c..150a5252ef 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.gravity9.jsonpatch.JsonPatch; import de.bund.digitalservice.ris.caselaw.adapter.JurisXmlExporterWrapper; import de.bund.digitalservice.ris.caselaw.adapter.MockXmlExporter; import de.bund.digitalservice.ris.caselaw.adapter.converter.docx.DocxConverter; @@ -17,6 +18,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.module.SimpleModule; @Configuration public class ConverterConfig { @@ -59,7 +61,13 @@ public TransformerFactory transformerFactory() { @Bean @Primary public JsonMapper jsonMapper() { - return JsonMapper.builder().build(); + var legacyObjectMapper = legacyObjectMapper(); + + var module = new SimpleModule(); + module.addDeserializer(JsonPatch.class, new JsonPatchDeserializer(legacyObjectMapper)); + module.addSerializer(JsonPatch.class, new JsonPatchSerializer(legacyObjectMapper)); + + return JsonMapper.builder().addModule(module).build(); } @Bean @@ -67,8 +75,10 @@ public XmlExporter jurisXmlExporter() { return new JurisXmlExporterWrapper(jsonMapper(), transformerFactory()); } + /** Jackson 2 object mapper to support dependencies that still depend on it. */ @Bean @Primary + @Deprecated(since = "2025-12-16") public ObjectMapper legacyObjectMapper() { var objectMapper = new ObjectMapper(); objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchDeserializer.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchDeserializer.java new file mode 100644 index 0000000000..b7b81c65f2 --- /dev/null +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchDeserializer.java @@ -0,0 +1,33 @@ +package de.bund.digitalservice.ris.caselaw.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gravity9.jsonpatch.JsonPatch; +import java.io.IOException; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.DeserializationContext; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.deser.std.StdNodeBasedDeserializer; + +/** + * Custom JSON Deserializer for {@link JsonPatch} as the library does not yet support Jackson 3. + * This class will use Jackson 2 to deserialize the JsonPatch. + */ +@Deprecated(since = "2025-12-16") +public class JsonPatchDeserializer extends StdNodeBasedDeserializer { + private final ObjectMapper legacyObjectMapper; + + public JsonPatchDeserializer(ObjectMapper legacyObjectMapper) { + super(JsonPatch.class); + this.legacyObjectMapper = legacyObjectMapper; + } + + @Override + public JsonPatch convert(JsonNode root, DeserializationContext ctxt) throws JacksonException { + try (com.fasterxml.jackson.core.JsonParser legacyParser = + legacyObjectMapper.createParser(root.toString())) { + return legacyParser.readValueAs(JsonPatch.class); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchSerializer.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchSerializer.java new file mode 100644 index 0000000000..97399c963a --- /dev/null +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchSerializer.java @@ -0,0 +1,33 @@ +package de.bund.digitalservice.ris.caselaw.config; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gravity9.jsonpatch.JsonPatch; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ser.std.StdSerializer; + +/** + * Custom JSON Serializer for {@link JsonPatch} as the library does not yet support Jackson 3. This + * class will use Jackson 2 to serialize the JsonPatch. + */ +@Deprecated(since = "2025-12-16") +public class JsonPatchSerializer extends StdSerializer { + private final ObjectMapper legacyObjectMapper; + + public JsonPatchSerializer(ObjectMapper legacyObjectMapper) { + super(JsonPatch.class); + this.legacyObjectMapper = legacyObjectMapper; + } + + @Override + public void serialize(JsonPatch value, JsonGenerator gen, SerializationContext provider) + throws JacksonException { + try { + gen.writeRawValue(legacyObjectMapper.writerFor(JsonPatch.class).writeValueAsString(value)); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } +} diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/WebMvcConfiguration.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/WebMvcConfiguration.java index c62a8e208b..99a0ce8fff 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/WebMvcConfiguration.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/WebMvcConfiguration.java @@ -6,7 +6,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.http.converter.ByteArrayHttpMessageConverter; -import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.HttpMessageConverters; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -21,10 +21,11 @@ public WebMvcConfiguration(JsonMapper jsonMapper) { } @Override - public void configureMessageConverters(List> converters) { - converters.add(byteArrayHttpMessageConverter()); - converters.add(stringHttpMessageConverter()); - converters.add(new JacksonJsonHttpMessageConverter(jsonMapper)); + public void configureMessageConverters(HttpMessageConverters.ServerBuilder builder) { + builder + .addCustomConverter(byteArrayHttpMessageConverter()) + .addCustomConverter(stringHttpMessageConverter()) + .addCustomConverter(new JacksonJsonHttpMessageConverter(jsonMapper)); } private StringHttpMessageConverter stringHttpMessageConverter() { diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/DocumentationUnitControllerTestConfig.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/DocumentationUnitControllerTestConfig.java index e5c9089c6c..a365f64880 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/DocumentationUnitControllerTestConfig.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/DocumentationUnitControllerTestConfig.java @@ -2,6 +2,7 @@ import de.bund.digitalservice.ris.caselaw.adapter.DocumentNumberPatternConfig; import de.bund.digitalservice.ris.caselaw.adapter.OAuthService; +import de.bund.digitalservice.ris.caselaw.config.ConverterConfig; import de.bund.digitalservice.ris.caselaw.config.SecurityConfig; import de.bund.digitalservice.ris.caselaw.domain.mapper.PatchMapperService; import org.springframework.boot.test.context.TestConfiguration; @@ -14,5 +15,6 @@ TestConfig.class, PatchMapperService.class, DocumentNumberPatternConfig.class, + ConverterConfig.class }) public class DocumentationUnitControllerTestConfig {} diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/TestConfig.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/TestConfig.java index 2215de02aa..c01189f055 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/TestConfig.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/TestConfig.java @@ -1,19 +1,30 @@ package de.bund.digitalservice.ris.caselaw; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.gravity9.jsonpatch.JsonPatch; +import de.bund.digitalservice.ris.caselaw.config.JsonPatchDeserializer; +import de.bund.digitalservice.ris.caselaw.config.JsonPatchSerializer; import de.bund.digitalservice.ris.caselaw.webtestclient.RisWebTestClient; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.test.web.servlet.MockMvc; import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.module.SimpleModule; @TestConfiguration public class TestConfig { @Bean public RisWebTestClient risWebTestClient(MockMvc mockMvc) { - /* var objectMapper = new ObjectMapper(); - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - objectMapper.registerModule(new JavaTimeModule());*/ + var legacyObjectMapper = new ObjectMapper(); + legacyObjectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + legacyObjectMapper.registerModule(new JavaTimeModule()); - return new RisWebTestClient(mockMvc, JsonMapper.builder().build()); + var module = new SimpleModule(); + module.addDeserializer(JsonPatch.class, new JsonPatchDeserializer(legacyObjectMapper)); + module.addSerializer(JsonPatch.class, new JsonPatchSerializer(legacyObjectMapper)); + + return new RisWebTestClient(mockMvc, JsonMapper.builder().addModule(module).build()); } } diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java index ec8ae359d7..3a0cef96aa 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/DocumentationUnitControllerTest.java @@ -14,7 +14,6 @@ import static org.mockito.Mockito.when; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.TextNode; import com.gravity9.jsonpatch.JsonPatch; import com.gravity9.jsonpatch.JsonPatchOperation; @@ -143,7 +142,6 @@ class DocumentationUnitControllerTest { private static final String ISSUER_ADDRESS = "test-issuer@exporter.neuris"; private final DocumentationOffice docOffice = buildDSDocOffice(); private final User user = buildDSuser(); - private final ObjectMapper mapper = new ObjectMapper(); @BeforeEach void setup() throws DocumentationUnitNotExistsException { From ab881e0e94bd26e8c14be9666b335cb5c3bb99d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Tue, 16 Dec 2025 15:24:17 +0100 Subject: [PATCH 13/21] Fix deserialization of null values for booleans RISDEV-10437 --- .../digitalservice/ris/caselaw/config/ConverterConfig.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java index 150a5252ef..9b6e0aabce 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java @@ -17,6 +17,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; +import tools.jackson.databind.DeserializationFeature; import tools.jackson.databind.json.JsonMapper; import tools.jackson.databind.module.SimpleModule; @@ -67,7 +68,10 @@ public JsonMapper jsonMapper() { module.addDeserializer(JsonPatch.class, new JsonPatchDeserializer(legacyObjectMapper)); module.addSerializer(JsonPatch.class, new JsonPatchSerializer(legacyObjectMapper)); - return JsonMapper.builder().addModule(module).build(); + return JsonMapper.builder() + .disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES) + .addModule(module) + .build(); } @Bean From f5a40a6468b53b9f2592b7acaff930a684d3a5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Mon, 15 Dec 2025 12:15:42 +0100 Subject: [PATCH 14/21] Fix criteria for creatingDocumentationOffice The field creatingDocumentationOffice couldn't be found as it is only part of DocumentationUnitDTO. With Spring Boot 4 the Root object needs to actually be created from the correct class (it worked before eventhough creatingDocumentationOffice is only a part of DecisionDTO). RISDEV-10437 --- .../database/jpa/PostgresDocumentationUnitRepositoryImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java index 480dcc2ba5..fdd29612b6 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java @@ -958,7 +958,7 @@ public Slice searchLinkableDocumentationUnits( Root root = onlyPendingProceedings ? criteriaQuery.from(PendingProceedingDTO.class) - : criteriaQuery.from(DocumentationUnitDTO.class); + : criteriaQuery.from(DecisionDTO.class); // Conditions setup Predicate conditions = criteriaBuilder.conjunction(); // Start with an empty conjunction (AND) From 5086ceb6d4c9538c7a9b76602a6950512ebd17a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Mon, 15 Dec 2025 15:40:03 +0100 Subject: [PATCH 15/21] Fix use of redis in health check RISDEV-10437 --- backend/src/main/resources/application.yaml | 5 ++++- .../ris/caselaw/integration/tests/BaseIntegrationTest.java | 6 ++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/backend/src/main/resources/application.yaml b/backend/src/main/resources/application.yaml index 606f7ef091..7cf9a566c4 100644 --- a/backend/src/main/resources/application.yaml +++ b/backend/src/main/resources/application.yaml @@ -16,7 +16,10 @@ management: show-details: always group: readiness: - include: readinessState,db # TODO: (Malte Laukötter, 2025-12-15) readd redis + include: readinessState,redis,db + # Since the update to Spring Boot 4 the group membership validation thinks that redis is not available. This is + # wrong. Redis is still correctly included in the readiness check. + validate-group-membership: false endpoints: web: exposure: diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java index 54db077815..f1e729ae5d 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/integration/tests/BaseIntegrationTest.java @@ -49,10 +49,8 @@ "management.endpoint.health.probes.enabled=true", "management.health.livenessState.enabled=true", "management.health.readinessState.enabled=true", - "management.endpoint.health.group.readiness.include=readinessState,db", // TODO: (Malte - // Laukötter, - // 2025-12-15) include - // redis again + "management.endpoint.health.group.readiness.include=readinessState,redis,db", + "management.endpoint.health.validate-group-membership=false", "spring.security.oauth2.client.provider.keycloak.issuer-uri=localhost", }) @AutoConfigureMockMvc From bf02447d47747bd5d6d1a5db15548e4ea3fd2741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Thu, 18 Dec 2025 13:21:09 +0100 Subject: [PATCH 16/21] Fix searching linkable documentation units RISDEV-10437 --- ...stgresDocumentationUnitRepositoryImpl.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java index fdd29612b6..9668e4e30d 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java @@ -955,10 +955,7 @@ public Slice searchLinkableDocumentationUnits( CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(DocumentationUnitDTO.class); - Root root = - onlyPendingProceedings - ? criteriaQuery.from(PendingProceedingDTO.class) - : criteriaQuery.from(DecisionDTO.class); + Root root = criteriaQuery.from(DocumentationUnitDTO.class); // Conditions setup Predicate conditions = criteriaBuilder.conjunction(); // Start with an empty conjunction (AND) @@ -1038,6 +1035,12 @@ public Slice searchLinkableDocumentationUnits( "%" + documentNumber.trim().toUpperCase() + "%")); } + if (onlyPendingProceedings) { + conditions = + criteriaBuilder.and( + conditions, criteriaBuilder.equal(root.type(), PendingProceedingDTO.class)); + } + Predicate publicationStatusPredicate = criteriaBuilder.or( criteriaBuilder.equal( @@ -1046,18 +1049,16 @@ public Slice searchLinkableDocumentationUnits( root.get(STATUS).get(PUBLICATION_STATUS), PublicationStatus.PUBLISHING)); Predicate externalHandoverPendingPredicate = - // PendingProceedings don't have a `creatingDocumentationOffice` so this predicate does not - // work when filtering - // for PendingProceedings. - onlyPendingProceedings - ? criteriaBuilder.disjunction() - : criteriaBuilder.and( - criteriaBuilder.equal( - root.get(STATUS).get(PUBLICATION_STATUS), - PublicationStatus.EXTERNAL_HANDOVER_PENDING), - criteriaBuilder.equal( - root.get("creatingDocumentationOffice").get("id"), - documentationOfficeDTO.getId())); + criteriaBuilder.and( + criteriaBuilder.equal( + root.get(STATUS).get(PUBLICATION_STATUS), + PublicationStatus.EXTERNAL_HANDOVER_PENDING), + criteriaBuilder.equal( + criteriaBuilder + .treat(root, DecisionDTO.class) + .get("creatingDocumentationOffice") + .get("id"), + documentationOfficeDTO.getId())); Predicate finalPredicate = criteriaBuilder.or( From ef8a8307491b11e5535dd624c0bfc13ea8b3ed1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Thu, 18 Dec 2025 13:29:54 +0100 Subject: [PATCH 17/21] Use JPA Metamodel API instead of strings RISDEV-10437 --- ...stgresDocumentationUnitRepositoryImpl.java | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java index 9668e4e30d..8ff97ce66e 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/adapter/database/jpa/PostgresDocumentationUnitRepositoryImpl.java @@ -973,7 +973,8 @@ public Slice searchLinkableDocumentationUnits( // 1. Filter by document number if (documentNumberToExclude != null) { Predicate documentNumberPredicate = - criteriaBuilder.notEqual(root.get("documentNumber"), documentNumberToExclude); + criteriaBuilder.notEqual( + root.get(DocumentationUnitDTO_.documentNumber), documentNumberToExclude); conditions = criteriaBuilder.and(conditions, documentNumberPredicate); } @@ -981,7 +982,7 @@ public Slice searchLinkableDocumentationUnits( if (courtType != null) { Predicate courtTypePredicate = criteriaBuilder.like( - criteriaBuilder.upper(root.get("court").get("type")), + criteriaBuilder.upper(root.get(DocumentationUnitDTO_.court).get(CourtDTO_.type)), "%" + courtType.toUpperCase() + "%"); conditions = criteriaBuilder.and(conditions, courtTypePredicate); } @@ -990,23 +991,26 @@ public Slice searchLinkableDocumentationUnits( if (courtLocation != null) { Predicate courtLocationPredicate = criteriaBuilder.like( - criteriaBuilder.upper(root.get("court").get("location")), + criteriaBuilder.upper(root.get(DocumentationUnitDTO_.court).get(CourtDTO_.location)), "%" + courtLocation.toUpperCase() + "%"); conditions = criteriaBuilder.and(conditions, courtLocationPredicate); } // 4. Filter by decision date if (decisionDate != null) { - Predicate decisionDatePredicate = criteriaBuilder.equal(root.get("date"), decisionDate); + Predicate decisionDatePredicate = + criteriaBuilder.equal(root.get(DocumentationUnitDTO_.date), decisionDate); conditions = criteriaBuilder.and(conditions, decisionDatePredicate); } // 5. Filter by file number if (fileNumber != null) { - Join fileNumberJoin = root.join("fileNumbers", JoinType.LEFT); + Join fileNumberJoin = + root.join(DocumentationUnitDTO_.fileNumbers, JoinType.LEFT); Predicate fileNumberPredicate = criteriaBuilder.like( - criteriaBuilder.upper(fileNumberJoin.get("value")), fileNumber.toUpperCase() + "%"); + criteriaBuilder.upper(fileNumberJoin.get(FileNumberDTO_.value)), + fileNumber.toUpperCase() + "%"); conditions = criteriaBuilder.and(conditions, fileNumberPredicate); } @@ -1014,50 +1018,53 @@ public Slice searchLinkableDocumentationUnits( if (documentType != null) { Predicate documentTypePredicate = criteriaBuilder.equal( - root.get("documentType"), DocumentTypeTransformer.transformToDTO(documentType)); + root.get(DocumentationUnitDTO_.documentType), + DocumentTypeTransformer.transformToDTO(documentType)); conditions = criteriaBuilder.and(conditions, documentTypePredicate); } - // 7. Filter by publication status - final String PUBLICATION_STATUS = "publicationStatus"; - final String STATUS = "status"; - Predicate documentationOfficeIdPredicate = - criteriaBuilder.equal( - root.get("documentationOffice").get("id"), documentationOfficeDTO.getId()); - - // 8. Filter by document number + // 7. Filter by document number if (documentNumber != null) { conditions = criteriaBuilder.and( conditions, criteriaBuilder.like( - criteriaBuilder.upper(root.get("documentNumber")), + criteriaBuilder.upper(root.get(DocumentationUnitDTO_.documentNumber)), "%" + documentNumber.trim().toUpperCase() + "%")); } + // 8. Filter by onlyPendingProceedings if (onlyPendingProceedings) { conditions = criteriaBuilder.and( conditions, criteriaBuilder.equal(root.type(), PendingProceedingDTO.class)); } + // 9. Filter by publication status + Predicate documentationOfficeIdPredicate = + criteriaBuilder.equal( + root.get(DocumentationUnitDTO_.documentationOffice).get(DocumentationOfficeDTO_.id), + documentationOfficeDTO.getId()); + Predicate publicationStatusPredicate = criteriaBuilder.or( criteriaBuilder.equal( - root.get(STATUS).get(PUBLICATION_STATUS), PublicationStatus.PUBLISHED), + root.get(DocumentationUnitDTO_.status).get(StatusDTO_.publicationStatus), + PublicationStatus.PUBLISHED), criteriaBuilder.equal( - root.get(STATUS).get(PUBLICATION_STATUS), PublicationStatus.PUBLISHING)); + root.get(DocumentationUnitDTO_.status).get(StatusDTO_.publicationStatus), + PublicationStatus.PUBLISHING)); Predicate externalHandoverPendingPredicate = criteriaBuilder.and( criteriaBuilder.equal( - root.get(STATUS).get(PUBLICATION_STATUS), + root.get(DocumentationUnitDTO_.status).get(StatusDTO_.publicationStatus), PublicationStatus.EXTERNAL_HANDOVER_PENDING), criteriaBuilder.equal( criteriaBuilder .treat(root, DecisionDTO.class) - .get("creatingDocumentationOffice") - .get("id"), + .get(DecisionDTO_.creatingDocumentationOffice) + .get(DocumentationOfficeDTO_.id), documentationOfficeDTO.getId())); Predicate finalPredicate = From f4806133ddb69bb714cac6ac58ee1f330ec8aa6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Thu, 18 Dec 2025 15:02:32 +0100 Subject: [PATCH 18/21] Update neuris-juris-xml-export RISDEV-10437 --- backend/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 5c823ffa1b..97a35585ba 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -198,11 +198,11 @@ dependencies { implementation("com.icegreen:greenmail:2.1.7") // package served by private repo, requires authentication: - implementation("de.bund.digitalservice:neuris-juris-xml-export:0.10.45") { + implementation("de.bund.digitalservice:neuris-juris-xml-export:0.10.46") { exclude(group = "org.slf4j", module = "slf4j-simple") } // for local development: -// implementation(files("../../neuris-juris-xml-export/build/libs/neuris-juris-xml-export-0.10.45.jar")) +// implementation(files("../../neuris-juris-xml-export/build/libs/neuris-juris-xml-export-0.10.46.jar")) // or with local gradle project (look also into settings.gradle.kts) // implementation(project(":exporter")) From 63ec2c49ef6a5d7ad37bf40bd2428ad9cf6edc53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Thu, 18 Dec 2025 16:07:28 +0100 Subject: [PATCH 19/21] Add deprecation Javadoc comments RISDEV-10437 --- .../digitalservice/ris/caselaw/config/ConverterConfig.java | 6 +++++- .../ris/caselaw/config/JsonPatchDeserializer.java | 2 ++ .../ris/caselaw/config/JsonPatchSerializer.java | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java index 9b6e0aabce..3b82c9e81d 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/ConverterConfig.java @@ -79,7 +79,11 @@ public XmlExporter jurisXmlExporter() { return new JurisXmlExporterWrapper(jsonMapper(), transformerFactory()); } - /** Jackson 2 object mapper to support dependencies that still depend on it. */ + /** + * Jackson 2 object mapper to support dependencies that still depend on it. + * + * @deprecated use {@link #jsonMapper()} instead + */ @Bean @Primary @Deprecated(since = "2025-12-16") diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchDeserializer.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchDeserializer.java index b7b81c65f2..d5025bdb37 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchDeserializer.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchDeserializer.java @@ -11,6 +11,8 @@ /** * Custom JSON Deserializer for {@link JsonPatch} as the library does not yet support Jackson 3. * This class will use Jackson 2 to deserialize the JsonPatch. + * + * @deprecated will be removed once {@link JsonPatch} supports Jackson 3 */ @Deprecated(since = "2025-12-16") public class JsonPatchDeserializer extends StdNodeBasedDeserializer { diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchSerializer.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchSerializer.java index 97399c963a..fe8dd9cf90 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchSerializer.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchSerializer.java @@ -11,6 +11,8 @@ /** * Custom JSON Serializer for {@link JsonPatch} as the library does not yet support Jackson 3. This * class will use Jackson 2 to serialize the JsonPatch. + * + * @deprecated will be removed once {@link JsonPatch} supports Jackson 3 */ @Deprecated(since = "2025-12-16") public class JsonPatchSerializer extends StdSerializer { From 5f8a55cbde8920c51a2ea637138d0d56bc10aee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Thu, 18 Dec 2025 16:09:15 +0100 Subject: [PATCH 20/21] Remove unneeded throws statements RISDEV-10437 --- .../adapter/PortalPublicationServiceTest.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationServiceTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationServiceTest.java index 42879762b4..61ae173837 100644 --- a/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationServiceTest.java +++ b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationServiceTest.java @@ -16,7 +16,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.core.JsonProcessingException; import de.bund.digitalservice.ris.caselaw.adapter.caselawldml.CaseLawLdml; import de.bund.digitalservice.ris.caselaw.adapter.caselawldml.FrbrElement; import de.bund.digitalservice.ris.caselaw.adapter.caselawldml.FrbrThis; @@ -167,7 +166,7 @@ static void setUpBeforeClass() { } @BeforeEach - void mockReset() throws JsonProcessingException { + void mockReset() { subject = new PortalPublicationService( documentationUnitRepository, @@ -626,7 +625,7 @@ void withdraw_withBucketException_shouldThrowPublishException() { class WithdrawDocumentationUnitWithChangelog { @Test void withdrawWithChangelog_shouldDeleteFromBucketAndWriteDeletionChangelog() - throws DocumentationUnitNotExistsException, JsonProcessingException { + throws DocumentationUnitNotExistsException { Decision decision = Decision.builder() .uuid(UUID.randomUUID()) @@ -739,7 +738,7 @@ void withdrawWithChangelog_withJacksonException_shouldThrowChangelogException() @Nested class UploadChangelog { @Test - void uploadChangelog_shouldUpload() throws JsonProcessingException { + void uploadChangelog_shouldUpload() { var changelogContent = """ {"changed":["1/1.xml"],"deleted":[]} @@ -764,7 +763,7 @@ void uploadChangelog_withDisabledFeatureFlag_shouldDoNothing() { @Nested class UploadDeletionChangelog { @Test - void uploadDeletionChangelog_shouldUpload() throws JsonProcessingException { + void uploadDeletionChangelog_shouldUpload() { var changelogContent = """ {"deleted":[123/123.xml]} @@ -787,8 +786,7 @@ void uploadFullReindexChangelog_withRegularChangelogsEnabled_shouldNotUpload() { } @Test - void uploadFullReindexChangelog_withRegularChangelogsDisabled_shouldUpload() - throws JsonProcessingException { + void uploadFullReindexChangelog_withRegularChangelogsDisabled_shouldUpload() { var changelogContent = """ {"changeAll":true} From 157bc2b4826b9a2f22379ad120abe8f732d54630 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Malte=20Lauk=C3=B6tter?= Date: Thu, 18 Dec 2025 16:10:28 +0100 Subject: [PATCH 21/21] Replace deprecated JacksonXmlRootElement RISDEV-10437 --- .../digitalservice/ris/caselaw/domain/court/CourtsXML.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtsXML.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtsXML.java index d86f56732d..98b8ecd754 100644 --- a/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtsXML.java +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/domain/court/CourtsXML.java @@ -1,13 +1,13 @@ package de.bund.digitalservice.ris.caselaw.domain.court; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRootName; import java.util.List; import lombok.Data; import tools.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; -import tools.jackson.dataformat.xml.annotation.JacksonXmlRootElement; @Data -@JacksonXmlRootElement(localName = "juris-table") +@JsonRootName("juris-table") public class CourtsXML { @JacksonXmlElementWrapper(useWrapping = false) @JsonProperty(value = "juris-gericht")