Как я могу заставить Джексона десериализовать строки XML для составного объекта Java с аннотациями JAXB, содержащими @XmlAnyElement - PullRequest
0 голосов
/ 04 октября 2018

У меня есть следующие аннотированные классы JAXB:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "payload"
})
@XmlRootElement(name = "response")
public class MyResponse {

    @XmlElement(required = true)
    protected MyPayload payload;

    public MyPayload getPayload() {
        return payload;
    }
}


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "myPayload", propOrder = {
    "any"
})
public class MyPayload {

    @XmlAnyElement(lax = true)
    protected Object any;

    public Object getAny() {
        return any;
    }

    public void setAny(Object value) {
        this.any = value;
    }

}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "mySpecificPayload", propOrder = {
    "field1",
    "field2",
})
public class MySpecificPayload {

    @XmlElement(name = "field-1", required = true)
    protected String field1;
    @XmlElement(name = "field-2")
    protected String field2;

}

Когда я пытаюсь десериализовать ввод:

<response>
  <payload>
    <my-specific-payload>
        <field-1>value1</field-1>
        <field-2>value2</field-2>        
    </my-specific-payload>
  </payload>  
</response>

, используя:

ObjectMapper mapper = new XmlMapper();
mapper.registerModule(new JaxbAnnotationModule());
MyResponse value = mapper.readValue(myXmlString, MyResponse.class);

Iget:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: нераспознанное поле «my-specific-payload» (класс com.example.MyPayload), не помеченное как игнорируемое (одно известное свойство:"any"])

Я хотел бы иметь возможность:

MyResponse value = mapper.readValue(myXmlString, MyResponse.class);
MySpecificPayload msp = (MySpecificPayload) value.getPayload().getAny();

В настоящее время использую библиотеки Джексона с версией: 2.9.6 Как мне получить Джексона, чтобы добиться этого?

Спасибо, Джейсон

...