Skip to content

@JsonAnyGetter + @JsonTypeInfo combination prevents serialization of properties as elements #117

@gawi

Description

@gawi

For the following class:

@JacksonXmlRootElement(localName = "dynaBean", namespace = "")
@JsonTypeInfo(use = Id.NAME, property = "class", include = As.PROPERTY)
public class DynaBean {

    private final Map<String, String> _properties = new TreeMap<String, String>();

    public DynaBean(Map<String, String> values) {
        _properties.putAll(values);
    }

    @JsonAnyGetter
    @JacksonXmlProperty(isAttribute = false)
    public Map<String, String> getProperties() {
        return _properties;
    }
}

For the code:

XmlMapper xmlMapper = new XmlMapper();
Map<String, String> values = new HashMap<String, String>();
values.put("prop1", "val1");
values.put("prop2", "val2");
System.out.println(xmlMapper.writeValueAsString(new DynaBean(values)));

Since we have @JacksonXmlProperty(isAttribute = false), we expect:

<dynaBean xmlns="" class="TestSerializationAttr$DynaBean">
  <prop1>val1</prop1>
  <prop2>val2</prop2>
</dynaBean>

But we have:

<dynaBean xmlns="" class="TestSerializationAttr$DynaBean" prop1="val1" prop2="val2">
</dynaBean>

Test case to add in com.fasterxml.jackson.dataformat.xml.ser.TestSerializationAttr

 @JacksonXmlRootElement(localName = "dynaBean", namespace = "")
    @JsonTypeInfo(use = Id.NAME, property = "class", include = As.PROPERTY)
    public class DynaBean {

        private final Map<String, String> _properties = new TreeMap<String, String>();

        public DynaBean(Map<String, String> values) {
            _properties.putAll(values);
        }

        @JsonAnyGetter
        @JacksonXmlProperty(isAttribute = false)
        public Map<String, String> getProperties() {
            return _properties;
        }
    }

    public void testIssue117() throws JsonProcessingException {
        Map<String, String> values = new HashMap<String, String>();
        values.put("prop1", "val1");
        values.put("prop2", "val2");

        assertEquals("<dynaBean xmlns=\"\" class=\"TestSerializationAttr$DynaBean\"><prop1>val1</prop1><prop2>val2</prop2></dynaBean>",
                     _xmlMapper.writeValueAsString(new DynaBean(values)));
    }

I believe the problem resides somewhere in XmlSerializerBase constructor where the _attributeCount does not take into account the @JsonAnyGetter.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions