From a76a83070fbc51d0af2cd7d30239f02e528ac07a Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Wed, 22 Apr 2015 22:43:02 -0700 Subject: [PATCH] Fix #40: XmlElementRef ignored if inside XmlElementWrapper --- release-notes/VERSION | 5 +++ .../jaxb/JaxbAnnotationIntrospector.java | 19 +++++------ .../jaxb/ser/DataHandlerJsonSerializer.java | 2 ++ .../jaxb/ser/DomElementJsonSerializer.java | 2 ++ .../jaxb/introspect/TestAccessType.java | 32 +++++++++++++++++-- 5 files changed, 47 insertions(+), 13 deletions(-) diff --git a/release-notes/VERSION b/release-notes/VERSION index 91f4d03..0783935 100644 --- a/release-notes/VERSION +++ b/release-notes/VERSION @@ -4,6 +4,11 @@ Project: jackson-module-jaxb-annotations === Releases === ------------------------------------------------------------------------ +2.5.3 (not yet released) + +#40: XmlElementRef ignored if inside XmlElementWrapper + (reported by gkresic@github) + 2.5.2 (29-Mar-2015) No changes since 2.5.1. diff --git a/src/main/java/com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector.java b/src/main/java/com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector.java index 3d73ad2..d93290a 100644 --- a/src/main/java/com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector.java +++ b/src/main/java/com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector.java @@ -1235,17 +1235,9 @@ private static PropertyName findJaxbPropertyName(Annotated ae, Class aeType, if (element != null) { return _combineNames(element.name(), element.namespace(), defaultName); } - /* 11-Sep-2012, tatu: Wrappers should not be automatically used for renaming. - * At least not here (databinding core can do it if feature enabled). - */ - /* - XmlElementWrapper elementWrapper = ae.getAnnotation(XmlElementWrapper.class); - if (elementWrapper != null) { - return _combineNames(elementWrapper.name(), elementWrapper.namespace(), defaultName); - } - */ XmlElementRef elementRef = ae.getAnnotation(XmlElementRef.class); - if (elementRef != null) { + boolean hasAName = (elementRef != null); + if (hasAName) { if (!MARKER_FOR_DEFAULT.equals(elementRef.name())) { return _combineNames(elementRef.name(), elementRef.namespace(), defaultName); } @@ -1261,9 +1253,14 @@ private static PropertyName findJaxbPropertyName(Annotated ae, Class aeType, } } } + if (!hasAName) { + hasAName = ae.hasAnnotation(XmlElementWrapper.class); + } // 09-Aug-2014, tatu: Note: prior to 2.4.2, we used to give explicit name "value" // if there was "@XmlValue" annotation; since then, only implicit name. - return null; + + // One more thing: + return hasAName ? PropertyName.USE_DEFAULT : null; } private static PropertyName _combineNames(String localName, String namespace, diff --git a/src/main/java/com/fasterxml/jackson/module/jaxb/ser/DataHandlerJsonSerializer.java b/src/main/java/com/fasterxml/jackson/module/jaxb/ser/DataHandlerJsonSerializer.java index b1fb20a..077a598 100644 --- a/src/main/java/com/fasterxml/jackson/module/jaxb/ser/DataHandlerJsonSerializer.java +++ b/src/main/java/com/fasterxml/jackson/module/jaxb/ser/DataHandlerJsonSerializer.java @@ -20,6 +20,8 @@ public class DataHandlerJsonSerializer extends StdSerializer { + private static final long serialVersionUID = 1L; + public DataHandlerJsonSerializer() { super(DataHandler.class); } @Override diff --git a/src/main/java/com/fasterxml/jackson/module/jaxb/ser/DomElementJsonSerializer.java b/src/main/java/com/fasterxml/jackson/module/jaxb/ser/DomElementJsonSerializer.java index 7ad97ca..a25915c 100644 --- a/src/main/java/com/fasterxml/jackson/module/jaxb/ser/DomElementJsonSerializer.java +++ b/src/main/java/com/fasterxml/jackson/module/jaxb/ser/DomElementJsonSerializer.java @@ -16,6 +16,8 @@ public class DomElementJsonSerializer extends StdSerializer { + private static final long serialVersionUID = 1L; + public DomElementJsonSerializer() { super(Element.class); } @Override diff --git a/src/test/java/com/fasterxml/jackson/module/jaxb/introspect/TestAccessType.java b/src/test/java/com/fasterxml/jackson/module/jaxb/introspect/TestAccessType.java index a1ef98a..6bc231f 100644 --- a/src/test/java/com/fasterxml/jackson/module/jaxb/introspect/TestAccessType.java +++ b/src/test/java/com/fasterxml/jackson/module/jaxb/introspect/TestAccessType.java @@ -1,6 +1,6 @@ package com.fasterxml.jackson.module.jaxb.introspect; -import java.util.Date; +import java.util.*; import javax.xml.bind.annotation.*; import javax.xml.bind.annotation.adapters.XmlAdapter; @@ -54,7 +54,21 @@ public Date unmarshal(String arg0) throws Exception { return new Date(Long.parseLong(arg0)); } } - + + // [jaxb-annotations#40]: Need to recognize more marker annotations + @XmlAccessorType(XmlAccessType.NONE) + public class Bean40 + { + @XmlElement + public int getA() { return 1; } + + @XmlElementWrapper(name="b") + public int getX() { return 2; } + + @XmlElementRef + public int getC() { return 3; } + } + /* /********************************************************** /* Unit tests @@ -89,4 +103,18 @@ public void testForJackson288() throws Exception assertNotNull(d); assertEquals(TIMESTAMP, d.getTime()); } + + public void testInclusionIssue40() throws Exception + { + ObjectMapper mapper = getJaxbMapper(); + mapper.enable(MapperFeature.USE_WRAPPER_NAME_AS_PROPERTY_NAME); + String json = mapper.writeValueAsString(new Bean40()); + @SuppressWarnings("unchecked") + Map map = mapper.readValue(json, Map.class); + Map exp = new LinkedHashMap(); + exp.put("a", Integer.valueOf(1)); + exp.put("b", Integer.valueOf(2)); + exp.put("c", Integer.valueOf(3)); + assertEquals(exp, map); + } }