From dd4290847c0762b2981628ec9165f83c369c743e Mon Sep 17 00:00:00 2001 From: Jon Bayle Date: Mon, 15 Dec 2025 16:58:44 +0100 Subject: [PATCH] HV-2161 Rework documentation example for Jackson 3 This use case: https://docs.hibernate.org/stable/validator/reference/en-US/html_single/#section-property-node-name-provider Uses the interpolator, which is an internal component of Jackson that was exposed for testing purposes. In Jackson 3, the interpolator is no longer publicly exposed, a Visitor must be used instead. See discussion here: https://github.com/FasterXML/jackson/discussions/330 --- documentation/pom.xml | 2 +- .../JacksonPropertyNodeNameProvider.java | 75 +++++++++++++------ .../PersonSerializationTest.java | 6 +- engine/pom.xml | 2 +- pom.xml | 18 ++--- 5 files changed, 65 insertions(+), 38 deletions(-) diff --git a/documentation/pom.xml b/documentation/pom.xml index b8af0d2ec4..8c0fb43f77 100644 --- a/documentation/pom.xml +++ b/documentation/pom.xml @@ -105,7 +105,7 @@ test - com.fasterxml.jackson.core + tools.jackson.core jackson-databind test diff --git a/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter12/nodenameprovider/JacksonPropertyNodeNameProvider.java b/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter12/nodenameprovider/JacksonPropertyNodeNameProvider.java index 736605f46d..337a9c50c3 100644 --- a/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter12/nodenameprovider/JacksonPropertyNodeNameProvider.java +++ b/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter12/nodenameprovider/JacksonPropertyNodeNameProvider.java @@ -4,42 +4,75 @@ */ package org.hibernate.validator.referenceguide.chapter12.nodenameprovider; -//tag::include[] import org.hibernate.validator.spi.nodenameprovider.JavaBeanProperty; import org.hibernate.validator.spi.nodenameprovider.Property; import org.hibernate.validator.spi.nodenameprovider.PropertyNodeNameProvider; -import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.JavaType; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.BeanProperty; +import tools.jackson.databind.JavaType; +import tools.jackson.databind.ObjectMapper; +import tools.jackson.databind.jsonFormatVisitors.JsonFormatVisitorWrapper; +import tools.jackson.databind.jsonFormatVisitors.JsonObjectFormatVisitor; + +//tag::include[] public class JacksonPropertyNodeNameProvider implements PropertyNodeNameProvider { private final ObjectMapper objectMapper = new ObjectMapper(); @Override public String getName(Property property) { - if ( property instanceof JavaBeanProperty ) { - return getJavaBeanPropertyName( (JavaBeanProperty) property ); + if (property instanceof JavaBeanProperty javaBeanProperty) { + var visitor = new JsonPropertyNameGetter(javaBeanProperty.getMemberName()); + try { + objectMapper.acceptJsonFormatVisitor( + javaBeanProperty.getDeclaringClass(), + visitor + ); + var attributeName = visitor.getAttributeName(); + return attributeName != null ? attributeName : property.getName(); + } catch (JacksonException ignored) {} } - - return getDefaultName( property ); + return property.getName(); } - private String getJavaBeanPropertyName(JavaBeanProperty property) { - JavaType type = objectMapper.constructType( property.getDeclaringClass() ); - BeanDescription desc = objectMapper.getSerializationConfig().introspect( type ); + // Visitor wrapper + private static class JsonPropertyNameGetter extends JsonFormatVisitorWrapper.Base { - return desc.findProperties() - .stream() - .filter( prop -> prop.getInternalName().equals( property.getName() ) ) - .map( BeanPropertyDefinition::getName ) - .findFirst() - .orElse( property.getName() ); - } + private final JsonObjectFormatVisitor visitor; + private String attributeName = null; + + JsonPropertyNameGetter(String memberName) { + this.visitor = new JsonObjectFormatVisitor.Base() { + + @Override + public void property(BeanProperty prop) { + setAttributeName(prop); + } + + @Override + public void optionalProperty(BeanProperty prop) { + setAttributeName(prop); + } + + private void setAttributeName(BeanProperty writer) { + if (memberName.equalsIgnoreCase(writer.getMember().getName())) { + attributeName = writer.getName(); + } + } + }; + } + + public String getAttributeName() { + return attributeName; + } + + @Override + public JsonObjectFormatVisitor expectObjectFormat(JavaType type) { + return visitor; + } - private String getDefaultName(Property property) { - return property.getName(); } + } //end::include[] diff --git a/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter12/nodenameprovider/PersonSerializationTest.java b/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter12/nodenameprovider/PersonSerializationTest.java index 6c791a9c5a..6ce7fa6e5f 100644 --- a/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter12/nodenameprovider/PersonSerializationTest.java +++ b/documentation/src/test/java/org/hibernate/validator/referenceguide/chapter12/nodenameprovider/PersonSerializationTest.java @@ -8,15 +8,15 @@ import org.junit.Test; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; +import tools.jackson.core.JacksonException; +import tools.jackson.databind.ObjectMapper; //tag::include[] public class PersonSerializationTest { private final ObjectMapper objectMapper = new ObjectMapper(); @Test - public void personIsSerialized() throws JsonProcessingException { + public void personIsSerialized() throws JacksonException { Person person = new Person( "Clark", "Kent" ); String serializedPerson = objectMapper.writeValueAsString( person ); diff --git a/engine/pom.xml b/engine/pom.xml index fd396d459a..ed8b984317 100644 --- a/engine/pom.xml +++ b/engine/pom.xml @@ -177,7 +177,7 @@ test - com.fasterxml.jackson.core + tools.jackson.core jackson-databind test diff --git a/pom.xml b/pom.xml index 218df7d030..32c09d9407 100644 --- a/pom.xml +++ b/pom.xml @@ -201,8 +201,7 @@ 33.5.0-jre 7.0.2 4.0.0.Final - 2.20.1 - 2.20 + 3.0.3 1.18.2 @@ -644,16 +643,11 @@ test - com.fasterxml.jackson.core - jackson-databind - ${version.com.fasterxml.jackson.core.jackson-databind} - test - - - com.fasterxml.jackson.core - jackson-annotations - ${version.com.fasterxml.jackson.core.jackson-annotations} - test + tools.jackson + jackson-bom + pom + import + ${version.tools.jackson.core.jackson-bom} javax.inject