From b43a5460ce0cc80304acce0355d989b8499a0595 Mon Sep 17 00:00:00 2001 From: asmhatre Date: Tue, 4 Aug 2026 17:32:06 +0000 Subject: [PATCH] Part 4 extra: ValueSerializer, the rename that breaks every custom handler --- .../part4custom/E05ValueSerializerDirect.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/com/ankurm/jackson3/part4custom/E05ValueSerializerDirect.java diff --git a/src/main/java/com/ankurm/jackson3/part4custom/E05ValueSerializerDirect.java b/src/main/java/com/ankurm/jackson3/part4custom/E05ValueSerializerDirect.java new file mode 100644 index 0000000..f275487 --- /dev/null +++ b/src/main/java/com/ankurm/jackson3/part4custom/E05ValueSerializerDirect.java @@ -0,0 +1,43 @@ +package com.ankurm.jackson3.part4custom; + +import tools.jackson.core.JsonGenerator; +import tools.jackson.databind.SerializationContext; +import tools.jackson.databind.ValueSerializer; +import tools.jackson.databind.json.JsonMapper; +import tools.jackson.databind.module.SimpleModule; + +/** + * BEYOND THE POST — the rename that breaks every custom handler on upgrade. + * + * Jackson 2's JsonSerializer/JsonDeserializer are gone. The Jackson 3 names + * are ValueSerializer/ValueDeserializer. Extending ValueSerializer directly + * (rather than StdSerializer) is the leanest form and shows the rename plainly. + */ +public class E05ValueSerializerDirect { + + public record UserId(String value) { } + + /** Renders the wrapper as a bare JSON string rather than {"value":"..."}. */ + static class UserIdSerializer extends ValueSerializer { + @Override + public void serialize(UserId id, JsonGenerator gen, SerializationContext ctxt) { + gen.writeString(id.value()); + } + } + + public record Ticket(UserId assignee, String title) { } + + public static void main(String[] args) { + SimpleModule module = new SimpleModule("UserIdModule"); + module.addSerializer(UserId.class, new UserIdSerializer()); + + JsonMapper mapper = JsonMapper.builder().addModule(module).build(); + System.out.println("custom : " + + mapper.writeValueAsString(new Ticket(new UserId("u-42"), "Fix build"))); + System.out.println("default : " + + JsonMapper.builder().build() + .writeValueAsString(new Ticket(new UserId("u-42"), "Fix build"))); + System.out.println("base class: " + + UserIdSerializer.class.getSuperclass().getName()); + } +}