diff --git a/memind-clients/java/memind-client/pom.xml b/memind-clients/java/memind-client/pom.xml
index a97973b0..ff0e8a73 100644
--- a/memind-clients/java/memind-client/pom.xml
+++ b/memind-clients/java/memind-client/pom.xml
@@ -33,13 +33,9 @@
- com.fasterxml.jackson.core
+ tools.jackson.core
jackson-databind
-
- com.fasterxml.jackson.datatype
- jackson-datatype-jsr310
-
org.slf4j
slf4j-api
diff --git a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/MemindClient.java b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/MemindClient.java
index 3ff394d9..1ec62d9a 100644
--- a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/MemindClient.java
+++ b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/MemindClient.java
@@ -13,7 +13,7 @@
*/
package com.openmemind.ai.client;
-import com.fasterxml.jackson.core.type.TypeReference;
+import tools.jackson.core.type.TypeReference;
import com.openmemind.ai.client.exception.MemindClientException;
import com.openmemind.ai.client.internal.ApiResult;
import com.openmemind.ai.client.internal.MemindHttpClient;
diff --git a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/exception/MemindApiException.java b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/exception/MemindApiException.java
index 6debb408..b8c8e65d 100644
--- a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/exception/MemindApiException.java
+++ b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/exception/MemindApiException.java
@@ -13,7 +13,7 @@
*/
package com.openmemind.ai.client.exception;
-import com.fasterxml.jackson.databind.JsonNode;
+import tools.jackson.databind.JsonNode;
public class MemindApiException extends MemindClientException {
diff --git a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/ErrorResult.java b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/ErrorResult.java
index 0d5db697..04cb6a44 100644
--- a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/ErrorResult.java
+++ b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/ErrorResult.java
@@ -14,7 +14,7 @@
package com.openmemind.ai.client.internal;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.databind.JsonNode;
+import tools.jackson.databind.JsonNode;
@JsonIgnoreProperties(ignoreUnknown = true)
record ErrorResult(ApiError error) {
diff --git a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/MemindHttpClient.java b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/MemindHttpClient.java
index 5298262a..cd775797 100644
--- a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/MemindHttpClient.java
+++ b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/MemindHttpClient.java
@@ -14,14 +14,15 @@
package com.openmemind.ai.client.internal;
import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.openmemind.ai.client.exception.MemindApiException;
import com.openmemind.ai.client.exception.MemindConnectionException;
import com.openmemind.ai.client.exception.MemindTimeoutException;
+import tools.jackson.core.JacksonException;
+import tools.jackson.core.type.TypeReference;
+import tools.jackson.databind.DeserializationFeature;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.DateTimeFeature;
+import tools.jackson.databind.json.JsonMapper;
import java.io.IOException;
import java.net.ConnectException;
import java.net.URI;
@@ -56,12 +57,7 @@ public MemindHttpClient(
HttpClient.newBuilder()
.connectTimeout(Objects.requireNonNull(connectTimeout, "connectTimeout"))
.build();
- this.objectMapper =
- new ObjectMapper()
- .registerModule(new JavaTimeModule())
- .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
- .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
- .setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ this.objectMapper = createObjectMapper();
}
public CompletableFuture get(String path, TypeReference> responseType) {
@@ -80,7 +76,7 @@ public CompletableFuture post(
.build();
log.debug("POST {}", request.uri());
return sendAsync(request, responseType);
- } catch (IOException e) {
+ } catch (JacksonException e) {
return CompletableFuture.failedFuture(
new MemindConnectionException("Failed to serialize request body", e));
}
@@ -140,7 +136,7 @@ private T handleResponse(
throw toApiException(status, body, requestId(response));
} catch (MemindApiException e) {
throw e;
- } catch (IOException e) {
+ } catch (JacksonException e) {
throw new MemindApiException(
status,
"parse_error",
@@ -150,8 +146,7 @@ private T handleResponse(
}
}
- private MemindApiException toApiException(int status, byte[] body, String requestId)
- throws IOException {
+ private MemindApiException toApiException(int status, byte[] body, String requestId) {
ErrorResult errorResult = objectMapper.readValue(body, ErrorResult.class);
ErrorResult.ApiError error = errorResult.error();
if (error == null) {
@@ -169,6 +164,19 @@ public ObjectMapper getObjectMapper() {
return objectMapper;
}
+ private static ObjectMapper createObjectMapper() {
+ ObjectMapper mapper =
+ JsonMapper.builder()
+ .disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS)
+ .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
+ .changeDefaultPropertyInclusion(
+ inclusion ->
+ inclusion.withValueInclusion(
+ JsonInclude.Include.NON_NULL))
+ .build();
+ return mapper;
+ }
+
@Override
public void close() {
// JDK HttpClient does not require explicit close in Java 17.
diff --git a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/RawContentSerializer.java b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/RawContentSerializer.java
index 1c600d1b..20078b9f 100644
--- a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/RawContentSerializer.java
+++ b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/internal/RawContentSerializer.java
@@ -13,27 +13,27 @@
*/
package com.openmemind.ai.client.internal;
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonSerializer;
-import com.fasterxml.jackson.databind.SerializerProvider;
import com.openmemind.ai.client.model.common.ConversationContent;
import com.openmemind.ai.client.model.common.MapRawContent;
import com.openmemind.ai.client.model.common.RawContent;
-import java.io.IOException;
+import tools.jackson.core.JacksonException;
+import tools.jackson.core.JsonGenerator;
+import tools.jackson.databind.SerializationContext;
+import tools.jackson.databind.ValueSerializer;
-public class RawContentSerializer extends JsonSerializer {
+public class RawContentSerializer extends ValueSerializer {
@Override
- public void serialize(RawContent value, JsonGenerator gen, SerializerProvider provider)
- throws IOException {
+ public void serialize(RawContent value, JsonGenerator gen, SerializationContext context)
+ throws JacksonException {
gen.writeStartObject();
- gen.writeStringField("type", value.type());
+ gen.writeStringProperty("type", value.type());
if (value instanceof ConversationContent conv) {
- gen.writeObjectField("messages", conv.getMessages());
+ context.defaultSerializeProperty("messages", conv.getMessages(), gen);
} else if (value instanceof MapRawContent map) {
for (var entry : map.getProperties().entrySet()) {
- gen.writeObjectField(entry.getKey(), entry.getValue());
+ context.defaultSerializeProperty(entry.getKey(), entry.getValue(), gen);
}
}
diff --git a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/model/common/RawContent.java b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/model/common/RawContent.java
index d736bcd0..b9718bcc 100644
--- a/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/model/common/RawContent.java
+++ b/memind-clients/java/memind-client/src/main/java/com/openmemind/ai/client/model/common/RawContent.java
@@ -13,7 +13,7 @@
*/
package com.openmemind.ai.client.model.common;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import tools.jackson.databind.annotation.JsonSerialize;
import com.openmemind.ai.client.internal.RawContentSerializer;
@JsonSerialize(using = RawContentSerializer.class)
diff --git a/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/internal/MemindHttpClientTest.java b/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/internal/MemindHttpClientTest.java
index 99e03a90..3297b530 100644
--- a/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/internal/MemindHttpClientTest.java
+++ b/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/internal/MemindHttpClientTest.java
@@ -28,7 +28,7 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import com.fasterxml.jackson.core.type.TypeReference;
+import tools.jackson.core.type.TypeReference;
import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo;
import com.github.tomakehurst.wiremock.junit5.WireMockTest;
import com.openmemind.ai.client.exception.MemindApiException;
diff --git a/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/model/common/MessageTest.java b/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/model/common/MessageTest.java
index 1da0e220..9009ad9a 100644
--- a/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/model/common/MessageTest.java
+++ b/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/model/common/MessageTest.java
@@ -15,18 +15,16 @@
import static org.assertj.core.api.Assertions.assertThat;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.DateTimeFeature;
+import tools.jackson.databind.json.JsonMapper;
import java.time.Instant;
import org.junit.jupiter.api.Test;
class MessageTest {
private final ObjectMapper mapper =
- new ObjectMapper()
- .registerModule(new JavaTimeModule())
- .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+ JsonMapper.builder().disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS).build();
@Test
void userMessage_serializesCorrectly() throws Exception {
diff --git a/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/model/common/RawContentSerializerTest.java b/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/model/common/RawContentSerializerTest.java
index 06cd369c..c671cbec 100644
--- a/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/model/common/RawContentSerializerTest.java
+++ b/memind-clients/java/memind-client/src/test/java/com/openmemind/ai/client/model/common/RawContentSerializerTest.java
@@ -15,9 +15,9 @@
import static org.assertj.core.api.Assertions.assertThat;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.cfg.DateTimeFeature;
+import tools.jackson.databind.json.JsonMapper;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;
@@ -25,9 +25,7 @@
class RawContentSerializerTest {
private final ObjectMapper mapper =
- new ObjectMapper()
- .registerModule(new JavaTimeModule())
- .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+ JsonMapper.builder().disable(DateTimeFeature.WRITE_DATES_AS_TIMESTAMPS).build();
@Test
void conversationContent_serializesWithRegisteredTypeField() throws Exception {
diff --git a/memind-evaluation/pom.xml b/memind-evaluation/pom.xml
index 7e04b166..8ee1ea20 100644
--- a/memind-evaluation/pom.xml
+++ b/memind-evaluation/pom.xml
@@ -72,10 +72,6 @@
spring-boot-starter-test
test
-
- com.fasterxml.jackson.datatype
- jackson-datatype-jsr310
-
diff --git a/memind-evaluation/src/main/java/com/openmemind/ai/memory/evaluation/checkpoint/CheckpointStore.java b/memind-evaluation/src/main/java/com/openmemind/ai/memory/evaluation/checkpoint/CheckpointStore.java
index 40c50aad..efe9ef05 100644
--- a/memind-evaluation/src/main/java/com/openmemind/ai/memory/evaluation/checkpoint/CheckpointStore.java
+++ b/memind-evaluation/src/main/java/com/openmemind/ai/memory/evaluation/checkpoint/CheckpointStore.java
@@ -13,8 +13,6 @@
*/
package com.openmemind.ai.memory.evaluation.checkpoint;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.openmemind.ai.memory.evaluation.adapter.model.SearchResult;
import com.openmemind.ai.memory.evaluation.pipeline.Stage;
import com.openmemind.ai.memory.evaluation.pipeline.model.AnswerResult;
@@ -28,6 +26,9 @@
import java.util.concurrent.locks.ReentrantLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import tools.jackson.core.JacksonException;
+import tools.jackson.core.type.TypeReference;
+import tools.jackson.databind.ObjectMapper;
/**
* Evaluation checkpoint persistence storage, responsible for reading and writing JSON files for checkpoint / search / answer stages
@@ -64,7 +65,7 @@ public CheckpointState load(String dataset, String runName) {
state.completedAddConvIds().size(),
state.completedStages().size());
return state;
- } catch (IOException e) {
+ } catch (JacksonException e) {
log.warn("Failed to read checkpoint, starting fresh: {}", e.getMessage());
}
}
@@ -86,7 +87,7 @@ public boolean isStageCompleted(Path runDir, Stage stage) {
try {
CheckpointState state = mapper.readValue(path.toFile(), CheckpointState.class);
return state.isStageCompleted(stage.name());
- } catch (IOException e) {
+ } catch (JacksonException e) {
log.warn("Failed to read checkpoint: {}", e.getMessage());
return false;
}
@@ -98,7 +99,7 @@ public void markStageCompleted(Path runDir, Stage stage) {
if (Files.exists(path)) {
try {
state = mapper.readValue(path.toFile(), CheckpointState.class);
- } catch (IOException e) {
+ } catch (JacksonException e) {
log.warn("Failed to read checkpoint, creating new: {}", e.getMessage());
state = new CheckpointState();
}
@@ -117,7 +118,7 @@ public Map> loadSearchCheckpoint(Path runDir) {
try {
return mapper.readValue(
path.toFile(), new TypeReference