2

测试豆

@JacksonXmlRootElement(localName = "DATA_RECORD")
public class TestBean{
    @JacksonXmlProperty(localName="ERROR_MESSAGE_CODE")
    private String error_message_code;
    @JacksonXmlProperty(localName="ERROR_MESSAGE")
    private String error_message;
    //...getter/setter
}

XML 样本

String xml = "<?xml version=\"1.0\" encoding=\"Windows-31J\" standalone=\"no\"?>"
            + "<Message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
            //+">"
            + "xsi:noNamespaceSchemaLocation=\"TEST.xsd\">" // if comment out this,it will work.
            + "<DATA_RECORD>"
            + "<ERROR_MESSAGE>some message</ERROR_MESSAGE>"
            + "<ERROR_MESSAGE_CODE>CODE111</ERROR_MESSAGE_CODE>"
            + "</DATA_RECORD>"
            + "</Message>";

反序列化

XmlMapper xmlMapper = new XmlMapper();
//xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
xmlMapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
TestBean test = xmlMapper.readValue(xml, TestBean.class);
log.debug(test.toString());

我从 Junit 运行它,我得到如下异常:

根名称“noNamespaceSchemaLocation”与预期不匹配(“DATA_RECORD”)...。

xsi:noNamespaceSchemaLocation="TEST.xsd"如果我从中删除String xml,它将正常工作。

对此有想法吗?感谢帮助。

4

1 回答 1

2

根据文档,当您指定时UNWRAP_ROOT_VALUE,杰克逊(这里是 XML 而不是 JSON)

将验证根 JSON 值是否为 JSON 对象,并且它具有具有预期根名称的单个属性。如果不是,则抛出 JsonMappingException;

在这种情况下,根除Message了 之外还有另一个属性,带有 name和指定 aDATA_RECORD的 XML 属性被抛出。noNamespaceSchemaLocationJsonMappingException

恐怕您将不得不解析MessageTestBean从那里获取。例如:

@JacksonXmlRootElement
class Message {
    @JacksonXmlProperty(localName = "DATA_RECORD")
    private TestBean dataRecord;
}

class TestBean {
    @JacksonXmlProperty(localName = "ERROR_MESSAGE_CODE")
    private String error_message_code;
    @JacksonXmlProperty(localName = "ERROR_MESSAGE")
    private String error_message;
}

xmlMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
Message test = xmlMapper.readValue(xml, Message.class);
log.debug(test.getDataRecord().toString());
于 2017-06-12T16:00:23.267 回答