2017-06-12 69 views
1

测试豆无法解析xml根元素的使用杰克逊

@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')....

如果我删除String xmlxsi:noNamespaceSchemaLocation="TEST.xsd",它会工作精细。

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

回答

1

按照docs,当您指定UNWRAP_ROOT_VALUE,杰克逊(XML这里,而不是JSON)

将验证根JSON值是一个JSON对象,它有 预计单个属性根名称。如果不是,则抛出一个 JsonMappingException;

在这种情况下根Message具有除了DATA_RECORD另一个属性,则XML名称为noNamespaceSchemaLocation属性和作为指定的JsonMappingException被抛出。

恐怕你必须解析Message并从那里得到TestBean。例如: -

@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()); 
+0

感谢您help.it作品!所以我不能解析XML部分喜欢拿为根元素,不? – fanshaoer