-
-
Notifications
You must be signed in to change notification settings - Fork 230
Closed
Description
Attempting to deserialize an unwrapped collection field (@JacksonXmlElementWrapper(useWrapping = false)
) fails if element is missing an attribute. For example, given:
static class Optional {
@JacksonXmlText
public String number = "NOT SET";
public String type = "NOT SET";
}
static class MultiOptional {
@JacksonXmlElementWrapper(useWrapping = false)
public List<Optional> optional;
}
XmlMapper
can handle <MultiOptional><optional type='work'>123-456-7890</optional></MultiOptional>
but not <MultiOptional><optional>123-456-7890</optional></MultiOptional>
(since it is missing type
property).
Here are some related additions I made to com.fasterxml.jackson.dataformat.xml.failing.TestDeserialization
to refine this issue:
private static class StateAttrLocalName
{
@JacksonXmlProperty(localName="state", isAttribute=true)
public String stateAttr = "NOT SET";
@Override public String toString() { return "StateAttrLocalName: stateAttr: " + stateAttr; }
}
public void testAttrLocalName() throws Exception
{
StateAttrLocalName ob = MAPPER.readValue("<Wrapper state='stateAttr'></Wrapper>",
StateAttrLocalName.class);
assertNotNull(ob);
System.err.println("ob: " + ob);
assertEquals("stateAttr", ob.stateAttr);
}
private static class StateAttr
{
@JacksonXmlProperty(localName="state", isAttribute=true)
public String state = "NOT SET";
@Override public String toString() { return "StateAttr: state: " + state; }
}
public void testAttr() throws Exception
{
StateAttr ob = MAPPER.readValue("<Wrapper state='stateAttr'></Wrapper>",
StateAttr.class);
assertNotNull(ob);
System.err.println("ob: " + ob);
assertEquals("stateAttr", ob.state);
}
private static class TwoStates
{
@JacksonXmlProperty(localName="state", isAttribute=true)
public String stateAttr = "NOT SET";
public String state = "NOT SET";
@Override public String toString() { return "TwoStates: stateAttr: " + stateAttr + " state: " + state; }
}
public void testAttrElementConflict() throws Exception
{
TwoStates ob = MAPPER.readValue("<Wrapper state='stateAttr'><state>stateElement</state></Wrapper>",
TwoStates.class);
assertNotNull(ob);
System.err.println("ob: " + ob);
assertEquals("stateElement", ob.state);
assertEquals("stateAttr", ob.stateAttr); // attribute stateAttr is ignored
}
private static class Optional
{
@JacksonXmlText
public String number = "NOT SET";
//@JacksonXmlProperty(isAttribute=true)
public String type = "NOT SET";
@Override public String toString() { return "Optional: number: " + number + " type: " + type; }
}
public void testOptionalAttr() throws Exception
{
Optional ob = MAPPER.readValue("<phone type='work'>123-456-7890</phone>",
Optional.class);
assertNotNull(ob);
System.err.println("ob: " + ob);
assertEquals("123-456-7890", ob.number);
assertEquals("work", ob.type);
}
public void testMissingOptionalAttr() throws Exception
{
Optional ob = MAPPER.readValue("<phone>123-456-7890</phone>",
Optional.class);
assertNotNull(ob);
System.err.println("ob: " + ob);
assertEquals("123-456-7890", ob.number);
assertEquals("NOT SET", ob.type);
}
private static class MultiOptional
{
@JacksonXmlElementWrapper(useWrapping = false)
public List<Optional> optional;
@Override public String toString() { return "MultiOptional: optional's: " + optional; }
}
public void testMultiOptional() throws Exception
{
MultiOptional ob = MAPPER.readValue("<MultiOptional><optional type='work'>123-456-7890</optional></MultiOptional>",
MultiOptional.class);
assertNotNull(ob);
System.err.println("ob: " + ob); // works fine
// assertEquals("123-456-7890", ob.number);
// assertEquals("NOT SET", ob.type);
}
public void testMultiOptionalWithMissingType() throws Exception
{
MultiOptional ob = MAPPER.readValue("<MultiOptional><optional>123-456-7890</optional></MultiOptional>",
MultiOptional.class);
assertNotNull(ob);
System.err.println("ob: " + ob); // fails:
// assertEquals("123-456-7890", ob.number);
// assertEquals("NOT SET", ob.type);
}
Metadata
Metadata
Assignees
Labels
No labels