diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 537eb35460..97a35585ba 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" @@ -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,12 +161,13 @@ 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") + implementation("org.springframework.boot:spring-boot-starter-flyway") - 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") @@ -197,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")) @@ -209,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") @@ -239,6 +241,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") @@ -251,7 +262,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") } 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/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"; 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) 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..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 @@ -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(DocumentationUnitDTO.class); + Root root = criteriaQuery.from(DocumentationUnitDTO.class); // Conditions setup Predicate conditions = criteriaBuilder.conjunction(); // Start with an empty conjunction (AND) @@ -976,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); } @@ -984,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); } @@ -993,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); } @@ -1017,47 +1018,54 @@ 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 = - // 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(DocumentationUnitDTO_.status).get(StatusDTO_.publicationStatus), + PublicationStatus.EXTERNAL_HANDOVER_PENDING), + criteriaBuilder.equal( + criteriaBuilder + .treat(root, DecisionDTO.class) + .get(DecisionDTO_.creatingDocumentationOffice) + .get(DocumentationOfficeDTO_.id), + documentationOfficeDTO.getId())); Predicate finalPredicate = criteriaBuilder.or( 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); 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..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 @@ -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; @@ -16,6 +17,9 @@ 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; @Configuration public class ConverterConfig { @@ -57,17 +61,37 @@ 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() { + var legacyObjectMapper = legacyObjectMapper(); + + var module = new SimpleModule(); + module.addDeserializer(JsonPatch.class, new JsonPatchDeserializer(legacyObjectMapper)); + module.addSerializer(JsonPatch.class, new JsonPatchSerializer(legacyObjectMapper)); + + return JsonMapper.builder() + .disable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES) + .addModule(module) + .build(); } @Bean public XmlExporter jurisXmlExporter() { - return new JurisXmlExporterWrapper(objectMapper(), transformerFactory()); + return new JurisXmlExporterWrapper(jsonMapper(), transformerFactory()); + } + + /** + * Jackson 2 object mapper to support dependencies that still depend on it. + * + * @deprecated use {@link #jsonMapper()} instead + */ + @Bean + @Primary + @Deprecated(since = "2025-12-16") + 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/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/JsonPatchDeserializer.java b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchDeserializer.java new file mode 100644 index 0000000000..d5025bdb37 --- /dev/null +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchDeserializer.java @@ -0,0 +1,35 @@ +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 will be removed once {@link JsonPatch} supports Jackson 3 + */ +@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..fe8dd9cf90 --- /dev/null +++ b/backend/src/main/java/de/bund/digitalservice/ris/caselaw/config/JsonPatchSerializer.java @@ -0,0 +1,35 @@ +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 will be removed once {@link JsonPatch} supports Jackson 3 + */ +@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/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 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..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 @@ -1,30 +1,31 @@ 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; 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.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)); + public void configureMessageConverters(HttpMessageConverters.ServerBuilder builder) { + builder + .addCustomConverter(byteArrayHttpMessageConverter()) + .addCustomConverter(stringHttpMessageConverter()) + .addCustomConverter(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..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.dataformat.xml.annotation.JacksonXmlElementWrapper; -import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; +import com.fasterxml.jackson.annotation.JsonRootName; import java.util.List; import lombok.Data; +import tools.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper; @Data -@JacksonXmlRootElement(localName = "juris-table") +@JsonRootName("juris-table") public class CourtsXML { @JacksonXmlElementWrapper(useWrapping = false) @JsonProperty(value = "juris-gericht") diff --git a/backend/src/main/resources/application.yaml b/backend/src/main/resources/application.yaml index 17b9abfb62..7cf9a566c4 100644 --- a/backend/src/main/resources/application.yaml +++ b/backend/src/main/resources/application.yaml @@ -17,6 +17,9 @@ management: group: readiness: 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/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 fdfd3cef92..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 @@ -3,19 +3,28 @@ 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.registerModule(new JavaTimeModule()); - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + var legacyObjectMapper = new ObjectMapper(); + legacyObjectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + legacyObjectMapper.registerModule(new JavaTimeModule()); - return new RisWebTestClient(mockMvc, objectMapper); + 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/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..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; @@ -13,12 +12,13 @@ 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; 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/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..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 @@ -13,9 +13,7 @@ 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; import com.gravity9.jsonpatch.JsonPatch; import com.gravity9.jsonpatch.JsonPatchOperation; @@ -93,7 +91,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; @@ -105,6 +103,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) @@ -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 { 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..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; @@ -38,13 +37,14 @@ 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; 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/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/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/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/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/PortalPublicationServiceTest.java b/backend/src/test/java/de/bund/digitalservice/ris/caselaw/adapter/PortalPublicationServiceTest.java index 7aeb6b5e3b..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,8 +16,6 @@ import static org.mockito.Mockito.verify; 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 +61,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 { @@ -166,7 +166,7 @@ static void setUpBeforeClass() { } @BeforeEach - void mockReset() throws JsonProcessingException { + void mockReset() { subject = new PortalPublicationService( documentationUnitRepository, @@ -439,7 +439,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 +449,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( @@ -625,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()) @@ -688,8 +688,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 +701,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)) @@ -738,7 +738,7 @@ void withdrawWithChangelog_withJsonProcessingException_shouldThrowChangelogExcep @Nested class UploadChangelog { @Test - void uploadChangelog_shouldUpload() throws JsonProcessingException { + void uploadChangelog_shouldUpload() { var changelogContent = """ {"changed":["1/1.xml"],"deleted":[]} @@ -763,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]} @@ -786,8 +786,7 @@ void uploadFullReindexChangelog_withRegularChangelogsEnabled_shouldNotUpload() { } @Test - void uploadFullReindexChangelog_withRegularChangelogsDisabled_shouldUpload() - throws JsonProcessingException { + void uploadFullReindexChangelog_withRegularChangelogsDisabled_shouldUpload() { var changelogContent = """ {"changeAll":true} 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..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; @@ -26,7 +25,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; @@ -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/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/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"); 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..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 @@ -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; @@ -49,7 +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,redis", + "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 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;