diff --git a/.github/workflows/create-release.yaml b/.github/workflows/create-release.yaml index 15fa4a697..8e24b1694 100644 --- a/.github/workflows/create-release.yaml +++ b/.github/workflows/create-release.yaml @@ -71,7 +71,7 @@ jobs: java-version: '25' - name: install model filiere - run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true + run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true - name: Clone BPM uses: actions/checkout@v6 @@ -182,4 +182,4 @@ jobs: password: ${{ secrets.DOCKERHUB_TOKEN }} default_branch: ${{ github.ref }} tags: ${{ needs.check-version.outputs.release-tag }} - workdir: . \ No newline at end of file + workdir: . diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 030f04e8c..34ef52940 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -28,7 +28,7 @@ jobs: java-version: "25" - name: install model filiere - run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true + run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true - name: Clone BPM uses: actions/checkout@master diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index ca58eeca0..9fb5dcea9 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -30,7 +30,7 @@ jobs: cache: maven - name: install model filiere - run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true + run: mvn install:install-file -Dfile="$(pwd)/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true - name: Clone BPM uses: actions/checkout@master diff --git a/.github/workflows/scheduled-version-update.yaml b/.github/workflows/scheduled-version-update.yaml index 29adabad1..c06fa32c4 100644 --- a/.github/workflows/scheduled-version-update.yaml +++ b/.github/workflows/scheduled-version-update.yaml @@ -87,7 +87,7 @@ jobs: - name: install model filiere run: | - mvn install:install-file -Dfile="$(pwd)/genesis/libs/modelefiliere-2.1.0.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.1.0 -Dpackaging=jar -DgeneratePom=true + mvn install:install-file -Dfile="$(pwd)/genesis/libs/modelefiliere-2.2.2-springboot4.jar" -DgroupId=fr.insee -DartifactId=modelefiliere -Dversion=2.2.2-springboot4 -Dpackaging=jar -DgeneratePom=true - name: Clone BPM uses: actions/checkout@master diff --git a/.gitignore b/.gitignore index 21e24e4c5..918479bc7 100644 --- a/.gitignore +++ b/.gitignore @@ -33,6 +33,7 @@ src/bin/ # Package Files # *.jar +!libs/*.jar *.war *.nar *.ear diff --git a/libs/modelefiliere-2.1.0.jar b/libs/modelefiliere-2.1.0.jar deleted file mode 100644 index cadda87eb..000000000 Binary files a/libs/modelefiliere-2.1.0.jar and /dev/null differ diff --git a/libs/modelefiliere-2.2.2-springboot4.jar b/libs/modelefiliere-2.2.2-springboot4.jar new file mode 100644 index 000000000..37408feeb Binary files /dev/null and b/libs/modelefiliere-2.2.2-springboot4.jar differ diff --git a/pom.xml b/pom.xml index b50013177..fd9399cde 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 3.5.14 + 4.0.6 @@ -20,12 +20,10 @@ 11.0.21 3.20.0 - 5.13.4 - 2.21.1 1.1.4 - 2.8.17 + 3.0.3 1.6.3 1.23.1 1.2.3 @@ -75,10 +73,19 @@ test - org.springframework.security - spring-security-test + org.springframework.boot + spring-boot-starter-security-test + test + + + org.springframework.boot + spring-boot-starter-webmvc-test test + + org.springframework.boot + spring-boot-starter-actuator + @@ -106,7 +113,7 @@ fr.insee modelefiliere - 2.1.0 + 2.2.2-springboot4 diff --git a/src/main/java/fr/insee/genesis/controller/dto/SurveyUnitInputDto.java b/src/main/java/fr/insee/genesis/controller/dto/SurveyUnitInputDto.java index 1c7ec8efd..c0af750d1 100644 --- a/src/main/java/fr/insee/genesis/controller/dto/SurveyUnitInputDto.java +++ b/src/main/java/fr/insee/genesis/controller/dto/SurveyUnitInputDto.java @@ -1,12 +1,16 @@ package fr.insee.genesis.controller.dto; import fr.insee.genesis.domain.model.surveyunit.Mode; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.util.List; @Builder +@NoArgsConstructor +@AllArgsConstructor @Data public class SurveyUnitInputDto { private String questionnaireId; diff --git a/src/main/java/fr/insee/genesis/controller/rest/LunaticModelController.java b/src/main/java/fr/insee/genesis/controller/rest/LunaticModelController.java index 47def0852..ed38ccee4 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/LunaticModelController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/LunaticModelController.java @@ -1,7 +1,6 @@ package fr.insee.genesis.controller.rest; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; import fr.insee.genesis.domain.model.lunaticmodel.LunaticModelModel; import fr.insee.genesis.domain.ports.api.LunaticModelApiPort; import fr.insee.genesis.exceptions.GenesisException; @@ -15,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import tools.jackson.databind.json.JsonMapper; import java.util.Map; @@ -45,10 +45,12 @@ public ResponseEntity saveRawResponsesFromJsonBody( @PreAuthorize("hasRole('READER')") public ResponseEntity getLunaticModelFromQuestionnaireId( @RequestParam("questionnaireId") String questionnaireId - ) throws JsonProcessingException, GenesisException { + ) throws JacksonException, GenesisException { LunaticModelModel lunaticModelModel = lunaticModelApiPort.get(questionnaireId); - ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules(); + JsonMapper objectMapper = JsonMapper.builder() + .findAndAddModules() + .build(); return ResponseEntity.ok(objectMapper.writeValueAsString(lunaticModelModel.lunaticModel())); } } diff --git a/src/main/java/fr/insee/genesis/controller/sources/xml/LunaticXmlDataParser.java b/src/main/java/fr/insee/genesis/controller/sources/xml/LunaticXmlDataParser.java index bbe8db83f..f6b974066 100644 --- a/src/main/java/fr/insee/genesis/controller/sources/xml/LunaticXmlDataParser.java +++ b/src/main/java/fr/insee/genesis/controller/sources/xml/LunaticXmlDataParser.java @@ -249,7 +249,7 @@ private static void setValues(LunaticXmlCollectedData varData, Node value, List< varData.setPrevious(valueTypes); break; default: - throw new GenesisException(HttpStatus.DESTINATION_LOCKED, "Tag not recognized: " + valueElement.getTagName()); + throw new GenesisException(HttpStatus.LOCKED, "Tag not recognized: " + valueElement.getTagName()); } } diff --git a/src/main/java/fr/insee/genesis/controller/utils/ExtendedJsonNormalizer.java b/src/main/java/fr/insee/genesis/controller/utils/ExtendedJsonNormalizer.java index 6bb1c4bdf..58226bfc4 100644 --- a/src/main/java/fr/insee/genesis/controller/utils/ExtendedJsonNormalizer.java +++ b/src/main/java/fr/insee/genesis/controller/utils/ExtendedJsonNormalizer.java @@ -1,9 +1,9 @@ package fr.insee.genesis.controller.utils; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; +import tools.jackson.databind.node.StringNode; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.node.ArrayNode; +import tools.jackson.databind.node.ObjectNode; public class ExtendedJsonNormalizer { public static final String $_DATE = "$date"; @@ -23,8 +23,8 @@ public static JsonNode normalize(JsonNode node) { ObjectNode obj = (ObjectNode) node; if (obj.size() == 1) { - if (obj.has($_DATE) && obj.get($_DATE).isTextual()) { - return TextNode.valueOf(obj.get($_DATE).asText()); + if (obj.has($_DATE) && obj.get($_DATE).isString()) { + return StringNode.valueOf(obj.get($_DATE).asString()); } // if (obj.has("$oid") && obj.get("$oid").isTextual()) { // return TextNode.valueOf(obj.get("$oid").asText()); @@ -32,9 +32,11 @@ public static JsonNode normalize(JsonNode node) { } ObjectNode copy = obj.objectNode(); - obj.fields().forEachRemaining(e -> + + obj.properties().forEach(e -> copy.set(e.getKey(), normalize(e.getValue())) ); + return copy; } diff --git a/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java b/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java index 001bbc925..84abf6865 100644 --- a/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java +++ b/src/main/java/fr/insee/genesis/domain/service/context/DataProcessingContextService.java @@ -1,7 +1,6 @@ package fr.insee.genesis.domain.service.context; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import tools.jackson.databind.json.JsonMapper; import fr.insee.genesis.Constants; import fr.insee.genesis.controller.dto.KraftwerkExecutionScheduleInput; import fr.insee.genesis.controller.dto.rawdata.ScheduleResponseDto; @@ -275,8 +274,9 @@ public void deleteExpiredSchedules(String logFolder) throws GenesisException { String scheduleName = context.getCollectionInstrumentId(); Path jsonLogPath = Path.of(logFolder, Constants.SCHEDULE_ARCHIVE_FOLDER_NAME, scheduleName + ".json"); - ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules(); - objectMapper.registerModule(new JavaTimeModule()); + JsonMapper objectMapper = JsonMapper.builder() + .findAndAddModules() + .build(); String jsonToWrite = objectMapper.writeValueAsString(deletedKraftwerkExecutionSchedules); if(Files.exists(jsonLogPath)){ //Remove last ] and append survey diff --git a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java index 140a367bf..93acc58ba 100644 --- a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java +++ b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java @@ -1,9 +1,10 @@ package fr.insee.genesis.domain.service.contextualvariable.external; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; +import fr.insee.genesis.exceptions.JsonParsingException; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonParser; +import tools.jackson.core.json.JsonFactory; +import tools.jackson.core.JsonToken; import fr.insee.genesis.domain.model.contextualvariable.ContextualExternalVariableModel; import fr.insee.genesis.domain.ports.api.ContextualExternalVariableApiPort; import fr.insee.genesis.domain.ports.spi.ContextualExternalVariablePersistancePort; @@ -74,7 +75,7 @@ public boolean readContextualExternalFile(String collectionInstrumentId, String contextualExternalVariablePersistancePort.deleteBackup(collectionInstrumentId); return true; } - }catch (JsonParseException jpe){ + }catch (JacksonException jpe){ contextualExternalVariablePersistancePort.restoreBackup(collectionInstrumentId); throw new GenesisException(HttpStatus.BAD_REQUEST, "JSON Parsing exception : %s".formatted(jpe.toString())); }catch (IOException ioe){ @@ -90,7 +91,7 @@ public ContextualExternalVariableModel findByCollectionInstrumentIdAndInterrogat private static boolean goToContextualExternalToken(JsonParser jsonParser) throws IOException { while (jsonParser.nextToken() != null) { - if (jsonParser.currentToken() == JsonToken.FIELD_NAME + if (jsonParser.currentToken() == JsonToken.PROPERTY_NAME && "editedExternal".equals(jsonParser.currentName())) { return true; } @@ -127,7 +128,7 @@ private ContextualExternalVariableModel readNextContextualExternal(JsonParser js String collectionInstrumentId ) throws IOException { if(jsonParser.currentToken() != JsonToken.START_OBJECT){ - throw new JsonParseException("Expected { on line %d, got token %s".formatted(jsonParser.currentLocation().getLineNr(), jsonParser.currentToken())); + throw new JsonParsingException("Expected { on line %d, got token %s".formatted(jsonParser.currentLocation().getLineNr(), jsonParser.currentToken())); } ContextualExternalVariableModel contextualExternalVariableModel = ContextualExternalVariableModel.builder() .collectionInstrumentId(collectionInstrumentId) @@ -135,7 +136,7 @@ private ContextualExternalVariableModel readNextContextualExternal(JsonParser js .build(); jsonParser.nextToken(); while (!jsonParser.currentToken().equals(JsonToken.END_OBJECT)){ - if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) && jsonParser.currentName().equals("interrogationId")){ + if(jsonParser.currentToken().equals(JsonToken.PROPERTY_NAME) && jsonParser.currentName().equals("interrogationId")){ jsonParser.nextToken(); contextualExternalVariableModel.setInterrogationId(jsonParser.getText()); jsonParser.nextToken(); diff --git a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java index 2599d843f..4a7cd4c35 100644 --- a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java +++ b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java @@ -1,9 +1,10 @@ package fr.insee.genesis.domain.service.contextualvariable.previous; -import com.fasterxml.jackson.core.JsonFactory; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonToken; +import tools.jackson.core.JacksonException; +import tools.jackson.core.json.JsonFactory; +import fr.insee.genesis.exceptions.JsonParsingException; +import tools.jackson.core.JsonParser; +import tools.jackson.core.JsonToken; import fr.insee.genesis.domain.model.contextualvariable.ContextualPreviousVariableModel; import fr.insee.genesis.domain.ports.api.ContextualPreviousVariableApiPort; import fr.insee.genesis.domain.ports.spi.ContextualPreviousVariablePersistancePort; @@ -41,7 +42,7 @@ public boolean readContextualPreviousFile(String collectionInstrumentId, try(FileInputStream inputStream = new FileInputStream(filePath)){ checkSourceStateLength(sourceState); - JsonFactory jsonFactory = new JsonFactory(); + JsonFactory jsonFactory = JsonFactory.builder().build(); try (JsonParser jsonParser = jsonFactory.createParser(inputStream)) { if (!goToEditedPreviousToken(jsonParser)) { log.warn("No EditedPrevious part found in file {}", filePath); @@ -79,7 +80,7 @@ public boolean readContextualPreviousFile(String collectionInstrumentId, contextualPreviousVariablePersistancePort.deleteBackup(collectionInstrumentId); return true; } - }catch (JsonParseException jpe){ + }catch (JacksonException jpe){ contextualPreviousVariablePersistancePort.restoreBackup(collectionInstrumentId); throw new GenesisException(HttpStatus.BAD_REQUEST, "JSON Parsing exception : %s".formatted(jpe.toString())); }catch (IOException _){ @@ -116,8 +117,8 @@ private static void checkSourceStateLength(String sourceState) throws GenesisExc private boolean goToEditedPreviousToken(JsonParser jsonParser) throws IOException { while (jsonParser.nextToken() != null) { - if (jsonParser.currentToken() == JsonToken.FIELD_NAME - && "editedPrevious".equals(jsonParser.getCurrentName())) { + if (jsonParser.currentToken() == JsonToken.PROPERTY_NAME + && "editedPrevious".equals(jsonParser.currentName())) { return true; } } @@ -129,7 +130,7 @@ private ContextualPreviousVariableModel readNextContextualPrevious(JsonParser js String sourceState ) throws IOException { if(jsonParser.currentToken() != JsonToken.START_OBJECT){ - throw new JsonParseException("Expected { on line %d, got token %s".formatted(jsonParser.currentLocation().getLineNr(), jsonParser.currentToken())); + throw new JsonParsingException("Expected { on line %d, got token %s".formatted(jsonParser.currentLocation().getLineNr(), jsonParser.currentToken())); } ContextualPreviousVariableModel contextualPreviousVariableModel = ContextualPreviousVariableModel.builder() .collectionInstrumentId(collectionInstrumentId) @@ -138,7 +139,7 @@ private ContextualPreviousVariableModel readNextContextualPrevious(JsonParser js .build(); jsonParser.nextToken(); while (!jsonParser.currentToken().equals(JsonToken.END_OBJECT)){ - if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) && jsonParser.currentName().equals("interrogationId")){ + if(jsonParser.currentToken().equals(JsonToken.PROPERTY_NAME) && jsonParser.currentName().equals("interrogationId")){ jsonParser.nextToken(); contextualPreviousVariableModel.setInterrogationId(jsonParser.getText()); jsonParser.nextToken(); @@ -174,7 +175,7 @@ private Object readValue(JsonParser jsonParser) throws IOException{ case START_ARRAY -> { return readArray(jsonParser); } - case null, default -> throw new JsonParseException("Unexpected token %s on line %d".formatted( + case null, default -> throw new JsonParsingException("Unexpected token %s on line %d".formatted( jsonParser.currentToken(), jsonParser.currentLocation().getLineNr()) ); } diff --git a/src/main/java/fr/insee/genesis/domain/utils/JsonUtils.java b/src/main/java/fr/insee/genesis/domain/utils/JsonUtils.java index e2b91c803..f0fa33a61 100644 --- a/src/main/java/fr/insee/genesis/domain/utils/JsonUtils.java +++ b/src/main/java/fr/insee/genesis/domain/utils/JsonUtils.java @@ -1,11 +1,10 @@ package fr.insee.genesis.domain.utils; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.core.JsonParser; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.JsonToken; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JsonParser; +import tools.jackson.core.JacksonException; +import tools.jackson.core.JsonToken; import lombok.experimental.UtilityClass; +import tools.jackson.databind.json.JsonMapper; import java.io.IOException; import java.util.ArrayList; @@ -14,9 +13,11 @@ @UtilityClass public class JsonUtils { - private static final ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules(); + JsonMapper objectMapper = JsonMapper.builder() + .findAndAddModules() + .build(); - public static Map jsonToMap(String json) throws JsonProcessingException { + public static Map jsonToMap(String json) throws JacksonException { return objectMapper.readValue(json, Map.class); } @@ -54,7 +55,7 @@ public static Object readValue(JsonParser jsonParser) throws IOException { case START_ARRAY -> { return readArray(jsonParser); } - case null, default -> throw new JsonParseException("Unexpected token %s on line %d".formatted( + case null, default -> throw new IOException("Unexpected token %s on line %d".formatted( jsonParser.currentToken(), jsonParser.currentLocation().getLineNr()) ); } diff --git a/src/main/java/fr/insee/genesis/exceptions/JsonParsingException.java b/src/main/java/fr/insee/genesis/exceptions/JsonParsingException.java new file mode 100644 index 000000000..b42d78a40 --- /dev/null +++ b/src/main/java/fr/insee/genesis/exceptions/JsonParsingException.java @@ -0,0 +1,9 @@ +package fr.insee.genesis.exceptions; + +import java.io.IOException; + +public class JsonParsingException extends IOException { + public JsonParsingException(String message) { + super(message); + } +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java index f74b8d18a..99a01737a 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/SurveyUnitMongoAdapter.java @@ -1,8 +1,7 @@ package fr.insee.genesis.infrastructure.adapter; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.JsonNode; import com.mongodb.client.MongoCollection; import fr.insee.genesis.Constants; import fr.insee.genesis.domain.model.surveyunit.InterrogationInfo; @@ -19,6 +18,7 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Service; +import tools.jackson.databind.json.JsonMapper; import java.time.Instant; import java.time.LocalDateTime; @@ -142,11 +142,13 @@ public long count() { private static @NotNull Set extractQuestionnaireIdsFromJson(Set mongoResponse) { Set questionnaireIds = new HashSet<>(); for(String line : mongoResponse){ - ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules(); + JsonMapper objectMapper = JsonMapper.builder() + .findAndAddModules() + .build(); try{ JsonNode jsonNode = objectMapper.readTree(line); questionnaireIds.add(jsonNode.get(QUESTIONNAIRE_ID).asText()); - }catch (JsonProcessingException e){ + }catch (JacksonException e){ log.error(e.getMessage()); } } diff --git a/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java b/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java index f90cd0096..a8a9c49ac 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java +++ b/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java @@ -1,6 +1,5 @@ package fr.insee.genesis.infrastructure.document.surveyunit; -import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import fr.insee.genesis.Constants; import fr.insee.modelefiliere.RawResponseDto; diff --git a/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepository.java b/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepository.java index 3b324e87e..fac05f343 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepository.java +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepository.java @@ -1,7 +1,7 @@ package fr.insee.genesis.infrastructure.repository; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; import fr.insee.modelefiliere.RawResponseDto; import lombok.RequiredArgsConstructor; import org.bson.Document; @@ -35,7 +35,7 @@ public void saveAsRawJson(RawResponseDto dto) { document.put("recordDate", Instant.now()); document.put("payload", payload); mongoTemplate.save(document, "rawResponses"); - } catch (JsonProcessingException e) { + } catch (JacksonException e) { throw new RuntimeException(e); } diff --git a/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java b/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java index 1e6952291..4e8f5b00c 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java +++ b/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java @@ -1,6 +1,5 @@ package fr.insee.genesis.infrastructure.utils; -import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.genesis.Constants; import fr.insee.genesis.configuration.Config; import fr.insee.genesis.domain.model.surveyunit.Mode; @@ -10,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; +import tools.jackson.databind.json.JsonMapper; import java.io.*; import java.nio.file.Files; @@ -226,8 +226,9 @@ public void writeFile(Path filePath, String fileContent) { */ public void writeSuUpdatesInFile(Path filePath, Stream responsesStream) throws IOException { Files.createDirectories(filePath.getParent()); - ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules(); - objectMapper.findAndRegisterModules(); + JsonMapper objectMapper = JsonMapper.builder() + .findAndAddModules() + .build(); try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath.toFile(), true))) { writer.write("["); responsesStream.forEach(response -> { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 15d29f604..a8cd56ab0 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -45,6 +45,6 @@ management.endpoint.health.show-details=always #-------------------------------------------------------------------------- # Database MongoDB #-------------------------------------------------------------------------- -spring.data.mongodb.auto-index-creation=true -spring.data.mongodb.uri=mongodb://${fr.insee.genesis.persistence.database.mongodb.username}:${fr.insee.genesis.persistence.database.mongodb.password}@${fr.insee.genesis.persistence.database.mongodb.host1}:${fr.insee.genesis.persistence.database.mongodb.port},${fr.insee.genesis.persistence.database.mongodb.host2}:${fr.insee.genesis.persistence.database.mongodb.port},${fr.insee.genesis.persistence.database.mongodb.host3}:${fr.insee.genesis.persistence.database.mongodb.port}/${fr.insee.genesis.persistence.database.mongodb.database} +spring.mongodb.auto-index-creation=true +spring.mongodb.uri=mongodb://${fr.insee.genesis.persistence.database.mongodb.username}:${fr.insee.genesis.persistence.database.mongodb.password}@${fr.insee.genesis.persistence.database.mongodb.host1}:${fr.insee.genesis.persistence.database.mongodb.port},${fr.insee.genesis.persistence.database.mongodb.host2}:${fr.insee.genesis.persistence.database.mongodb.port},${fr.insee.genesis.persistence.database.mongodb.host3}:${fr.insee.genesis.persistence.database.mongodb.port}/${fr.insee.genesis.persistence.database.mongodb.database} server.compression.enabled=true \ No newline at end of file diff --git a/src/test/java/fr/insee/genesis/controller/IntegrationTestAbstract.java b/src/test/java/fr/insee/genesis/controller/IntegrationTestAbstract.java index 27e255f50..338e14f00 100644 --- a/src/test/java/fr/insee/genesis/controller/IntegrationTestAbstract.java +++ b/src/test/java/fr/insee/genesis/controller/IntegrationTestAbstract.java @@ -14,10 +14,10 @@ import fr.insee.genesis.infrastructure.repository.SurveyUnitMongoDBRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; -import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.data.mongodb.autoconfigure.DataMongoAutoConfiguration; +import org.springframework.boot.mongodb.autoconfigure.MongoAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.TestPropertySource; @@ -34,7 +34,7 @@ @TestPropertySource(properties = { "logging.level.=DEBUG" }) -@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}) +@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, DataMongoAutoConfiguration.class}) public abstract class IntegrationTestAbstract { @Autowired protected MockMvc mockMvc; diff --git a/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java index 40abea177..e5d595cc4 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/DataProcessingContextControllerTest.java @@ -1,7 +1,7 @@ package fr.insee.genesis.controller.rest; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; +import tools.jackson.databind.ObjectMapper; import fr.insee.genesis.controller.dto.KraftwerkExecutionScheduleInput; import fr.insee.genesis.controller.dto.ScheduleRequestDto; import fr.insee.genesis.controller.dto.rawdata.ScheduleResponseDto; @@ -20,12 +20,12 @@ import org.junit.jupiter.params.provider.ValueSource; import org.mockito.ArgumentCaptor; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; +import tools.jackson.databind.json.JsonMapper; import java.time.LocalDateTime; import java.util.List; @@ -68,8 +68,9 @@ class DataProcessingContextControllerTest { @BeforeEach void setUp() { - objectMapper = new ObjectMapper(); - objectMapper.registerModule(new JavaTimeModule()); + objectMapper = JsonMapper.builder() + .findAndAddModules() + .build(); } @Nested diff --git a/src/test/java/fr/insee/genesis/controller/rest/HealthCheckControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/HealthCheckControllerTest.java index 5a19d42f2..87cd2daa3 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/HealthCheckControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/HealthCheckControllerTest.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; 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.security.test.context.support.WithMockUser; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.bean.override.mockito.MockitoBean; diff --git a/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerIT.java b/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerIT.java index 8f0f22558..69687c07e 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerIT.java +++ b/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerIT.java @@ -16,12 +16,11 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.ArgumentCaptor; -import org.mockito.Mock; import org.springframework.data.mongodb.core.ExecutableUpdateOperation; import org.springframework.data.mongodb.core.query.CriteriaDefinition; import org.springframework.data.mongodb.core.query.Update; import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import java.nio.file.Files; @@ -39,6 +38,7 @@ import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -46,13 +46,13 @@ class LunaticModelControllerIT extends IntegrationTestAbstract { - @Mock + @MockitoBean private ExecutableUpdateOperation.ExecutableUpdate executableUpdate; - @Mock + @MockitoBean private ExecutableUpdateOperation.UpdateWithUpdate updateWithUpdate; - @Mock + @MockitoBean private ExecutableUpdateOperation.TerminatingUpdate terminatingUpdate; @MockitoSpyBean @@ -76,7 +76,6 @@ class SaveLunaticModelTests{ "specs/LUNATIC-TEST/lunaticlog2021x21_web.json", "specs/RAWDATATESTCAMPAIGN/WEB/lunaticFAM2025X01.json" }) - @WithMockUser(roles = "USER_BACK_OFFICE") @DisplayName("Lunatic model saving test") @SneakyThrows void save_lunaticModel_test(String jsonFilePathString){ @@ -89,6 +88,7 @@ void save_lunaticModel_test(String jsonFilePathString){ //WHEN mockMvc.perform(put("/lunatic-model/save") + .with(user("test").roles("USER_BACK_OFFICE")) .with(csrf()) .param("questionnaireId", questionnaireId) .contentType(MediaType.APPLICATION_JSON) @@ -131,7 +131,6 @@ void save_lunaticModel_test(String jsonFilePathString){ //SAD PATH @Test - @WithMockUser(roles = "USER_BACK_OFFICE") @DisplayName("Lunatic model save invalid syntax") @SneakyThrows void save_lunaticModel_syntax_error_test(){ @@ -144,6 +143,7 @@ void save_lunaticModel_syntax_error_test(){ //WHEN + THEN mockMvc.perform(put("/lunatic-model/save") + .with(user("test").roles("USER_BACK_OFFICE")) .with(csrf()) .param("questionnaireId", questionnaireId) .contentType(MediaType.APPLICATION_JSON) @@ -159,7 +159,6 @@ class GetLunaticModelTests{ //HAPPY PATH @Test @DisplayName("Get Lunatic model test") - @WithMockUser(roles = "READER") @SneakyThrows void get_lunaticModel_test(){ //GIVEN @@ -180,6 +179,7 @@ void get_lunaticModel_test(){ //WHEN + THEN mockMvc.perform(get("/lunatic-model/get") + .with(user("test").roles("READER")) .with(csrf()) .param("questionnaireId", collectionInstrumentId)) .andExpect(status().isOk()) @@ -189,14 +189,12 @@ void get_lunaticModel_test(){ //BAD PATHS @Test @DisplayName("Get non existent Lunatic model") - @WithMockUser(roles = "READER") @SneakyThrows - void get_lunaticModel_not_found_test(){ - //GIVEN + void get_lunaticModel_not_found_test() { String collectionInstrumentId = "collectionInstrumentId"; - //WHEN + THEN mockMvc.perform(get("/lunatic-model/get") + .with(user("test").roles("READER")) .with(csrf()) .param("questionnaireId", collectionInstrumentId)) .andExpect(status().isNotFound()); diff --git a/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerTest.java index 5ab280608..09d688b50 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/LunaticModelControllerTest.java @@ -1,6 +1,6 @@ package fr.insee.genesis.controller.rest; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.ObjectMapper; import fr.insee.genesis.domain.model.lunaticmodel.LunaticModelModel; import fr.insee.genesis.domain.ports.api.LunaticModelApiPort; import lombok.SneakyThrows; @@ -11,6 +11,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.http.ResponseEntity; +import tools.jackson.databind.json.JsonMapper; import java.time.LocalDateTime; import java.util.HashMap; @@ -50,7 +51,9 @@ void saveRawResponsesFromJsonBody() { void getLunaticModelFromQuestionnaireId() { //GIVEN String questionnaireId = "test"; - ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules(); + JsonMapper objectMapper = JsonMapper.builder() + .findAndAddModules() + .build(); Map lunaticModel = new HashMap<>(); String expected = objectMapper.writeValueAsString(lunaticModel); doReturn(LunaticModelModel.builder() diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java index db58fdfb3..782e87c7b 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerIT.java @@ -1,7 +1,7 @@ package fr.insee.genesis.controller.rest.responses; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.databind.JsonNode; +import tools.jackson.databind.ObjectMapper; import fr.insee.bpm.metadata.model.MetadataModel; import fr.insee.bpm.metadata.model.Variable; import fr.insee.bpm.metadata.model.VariableType; @@ -32,6 +32,7 @@ import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; +import tools.jackson.databind.json.JsonMapper; import java.nio.file.Files; import java.nio.file.Path; @@ -69,8 +70,9 @@ class RawResponseControllerIT extends IntegrationTestAbstract { @BeforeEach void init(){ - objectMapper = new ObjectMapper(); - objectMapper.findAndRegisterModules(); + objectMapper = JsonMapper.builder() + .findAndAddModules() + .build(); } diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java index 50dc7c36d..b32bad06f 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/RawResponseControllerTest.java @@ -16,10 +16,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; -import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.data.mongodb.autoconfigure.DataMongoAutoConfiguration; +import org.springframework.boot.mongodb.autoconfigure.MongoAutoConfiguration; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; +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; @@ -62,7 +62,7 @@ @Import({DefaultSecurityConfig.class}) @ActiveProfiles("test") @AutoConfigureMockMvc -@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}) +@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, DataMongoAutoConfiguration.class}) class RawResponseControllerTest { @Autowired diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java index c57fd2d5a..5238e827b 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java @@ -25,10 +25,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration; -import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.data.mongodb.autoconfigure.DataMongoAutoConfiguration; +import org.springframework.boot.mongodb.autoconfigure.MongoAutoConfiguration; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; import org.springframework.context.annotation.Import; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -62,7 +62,7 @@ @Import({DefaultSecurityConfig.class}) @ActiveProfiles("test") @AutoConfigureMockMvc -@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}) +@EnableAutoConfiguration(exclude = {MongoAutoConfiguration.class, DataMongoAutoConfiguration.class}) class ResponseControllerTest { @Autowired diff --git a/src/test/java/fr/insee/genesis/domain/utils/JsonUtilsTest.java b/src/test/java/fr/insee/genesis/domain/utils/JsonUtilsTest.java index 01d1a880d..0a934d73d 100644 --- a/src/test/java/fr/insee/genesis/domain/utils/JsonUtilsTest.java +++ b/src/test/java/fr/insee/genesis/domain/utils/JsonUtilsTest.java @@ -1,6 +1,6 @@ package fr.insee.genesis.domain.utils; -import com.fasterxml.jackson.core.JsonProcessingException; +import tools.jackson.core.JacksonException; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; @@ -31,7 +31,7 @@ void jsonToMap_shouldThrowExceptionForInvalidJson() { String invalidJson = "{key1: value1, key2: }"; assertThatThrownBy(() -> JsonUtils.jsonToMap(invalidJson)) - .isInstanceOf(JsonProcessingException.class); + .isInstanceOf(JacksonException.class); } @Test diff --git a/src/test/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepositoryTest.java b/src/test/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepositoryTest.java index 27f778331..a302c6ceb 100644 --- a/src/test/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepositoryTest.java +++ b/src/test/java/fr/insee/genesis/infrastructure/repository/RawResponseInputRepositoryTest.java @@ -1,7 +1,7 @@ package fr.insee.genesis.infrastructure.repository; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; import fr.insee.modelefiliere.ModeDto; import fr.insee.modelefiliere.RawResponseDto; import org.junit.jupiter.api.DisplayName; @@ -49,7 +49,7 @@ class SaveAsRawJsonTests { @Test @DisplayName("Should serialize the DTO to JSON and save to the correct collection") - void saveAsRawJson_shouldSerializeAndSave() throws JsonProcessingException { + void saveAsRawJson_shouldSerializeAndSave() throws JacksonException { // GIVEN RawResponseDto dto = buildDto(); when(objectMapper.writeValueAsString(dto)).thenReturn("{\"interrogationId\":\"interrogation-123\"}"); @@ -64,7 +64,7 @@ void saveAsRawJson_shouldSerializeAndSave() throws JsonProcessingException { @Test @DisplayName("Should save a document containing interrogationId") - void saveAsRawJson_documentShouldContainInterrogationId() throws JsonProcessingException { + void saveAsRawJson_documentShouldContainInterrogationId() throws JacksonException { // GIVEN RawResponseDto dto = buildDto(); when(objectMapper.writeValueAsString(dto)).thenReturn("{}"); @@ -81,7 +81,7 @@ void saveAsRawJson_documentShouldContainInterrogationId() throws JsonProcessingE @Test @DisplayName("Should save a document containing collectionInstrumentId") - void saveAsRawJson_documentShouldContainCollectionInstrumentId() throws JsonProcessingException { + void saveAsRawJson_documentShouldContainCollectionInstrumentId() throws JacksonException { // GIVEN RawResponseDto dto = buildDto(); when(objectMapper.writeValueAsString(dto)).thenReturn("{}"); @@ -98,7 +98,7 @@ void saveAsRawJson_documentShouldContainCollectionInstrumentId() throws JsonProc @Test @DisplayName("Should save a document containing mode") - void saveAsRawJson_documentShouldContainMode() throws JsonProcessingException { + void saveAsRawJson_documentShouldContainMode() throws JacksonException { // GIVEN RawResponseDto dto = buildDto(); when(objectMapper.writeValueAsString(dto)).thenReturn("{}"); @@ -115,7 +115,7 @@ void saveAsRawJson_documentShouldContainMode() throws JsonProcessingException { @Test @DisplayName("Should save a document containing a non-null recordDate") - void saveAsRawJson_documentShouldContainRecordDate() throws JsonProcessingException { + void saveAsRawJson_documentShouldContainRecordDate() throws JacksonException { // GIVEN RawResponseDto dto = buildDto(); when(objectMapper.writeValueAsString(dto)).thenReturn("{}"); @@ -133,7 +133,7 @@ void saveAsRawJson_documentShouldContainRecordDate() throws JsonProcessingExcept @Test @DisplayName("Should save a document containing a non-null payload") - void saveAsRawJson_documentShouldContainPayload() throws JsonProcessingException { + void saveAsRawJson_documentShouldContainPayload() throws JacksonException { // GIVEN RawResponseDto dto = buildDto(); when(objectMapper.writeValueAsString(dto)) @@ -152,7 +152,7 @@ void saveAsRawJson_documentShouldContainPayload() throws JsonProcessingException @Test @DisplayName("Should save to the 'rawResponses' collection exactly") - void saveAsRawJson_shouldSaveToCorrectCollection() throws JsonProcessingException { + void saveAsRawJson_shouldSaveToCorrectCollection() throws JacksonException { // GIVEN RawResponseDto dto = buildDto(); when(objectMapper.writeValueAsString(dto)).thenReturn("{}"); @@ -168,7 +168,7 @@ void saveAsRawJson_shouldSaveToCorrectCollection() throws JsonProcessingExceptio @Test @DisplayName("Should call mongoTemplate.save() exactly once") - void saveAsRawJson_shouldCallSaveExactlyOnce() throws JsonProcessingException { + void saveAsRawJson_shouldCallSaveExactlyOnce() throws JacksonException { // GIVEN RawResponseDto dto = buildDto(); when(objectMapper.writeValueAsString(dto)).thenReturn("{}"); @@ -183,26 +183,26 @@ void saveAsRawJson_shouldCallSaveExactlyOnce() throws JsonProcessingException { @Test @DisplayName("Should wrap JsonProcessingException in RuntimeException") - void saveAsRawJson_jsonProcessingException_shouldThrowRuntimeException() throws JsonProcessingException { + void saveAsRawJson_jsonProcessingException_shouldThrowRuntimeException() throws JacksonException { // GIVEN RawResponseDto dto = buildDto(); when(objectMapper.writeValueAsString(dto)) - .thenThrow(new JsonProcessingException("serialization error") {}); + .thenThrow(new JacksonException("serialization error") {}); // WHEN / THEN assertThatThrownBy(() -> repository.saveAsRawJson(dto)) .isInstanceOf(RuntimeException.class) - .hasCauseInstanceOf(JsonProcessingException.class) + .hasCauseInstanceOf(JacksonException.class) .hasRootCauseMessage("serialization error"); } @Test @DisplayName("Should not call mongoTemplate when serialization fails") - void saveAsRawJson_jsonProcessingException_shouldNotCallMongoTemplate() throws JsonProcessingException { + void saveAsRawJson_jsonProcessingException_shouldNotCallMongoTemplate() throws JacksonException { // GIVEN RawResponseDto dto = buildDto(); when(objectMapper.writeValueAsString(dto)) - .thenThrow(new JsonProcessingException("serialization error") {}); + .thenThrow(new JacksonException("serialization error") {}); // WHEN try {