2015-04-07 634 views
0

我正在使用jackson库(2.5.2)并试图反序列化一些实际上具有CDATA部分的XML。用JacksonXML反序列化CDATA - 无法识别的属性异常

看来Jackson 2.5增加了对CDATA的支持。

这里是我的类,它有CDATA:

public class Certificate { 

@JacksonXmlProperty(localName = "name", isAttribute = true) 
private String name; 
@JacksonXmlCData 
private String data; 
@JacksonXmlProperty(localName = "date-added", isAttribute = true) 
@JsonFormat(pattern = "EEE MMM d HH:mm:ss z yyyy") 
private Date dateAdded; 
@JsonFormat(pattern = "EEE MMM d HH:mm:ss z yyyy") 
@JacksonXmlProperty(localName = "date-expires", isAttribute = true) 
private Date expirationDate; 


public void setData(String data) { 
    this.data = data; 
} 

public String getData() { 
    return data; 
} 

public String getName() { 
    return name; 
} 

public Date getDateAdded() { 
    return dateAdded; 
} 

public void setDateAdded(Date dateAdded) { 
    this.dateAdded = dateAdded; 
} 

}

,我得到下面的异常。根本就没有办法用jackson反序列化CDATA?

看来,使用JacksonXmlText工作正常,但当我需要序列化回来我需要的值在CDATA而不是文本。

这是我第一次使用杰克逊这个,所以我可能会错过一些明显的东西。

谢谢

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "" (class com.company.model.Certificate), 
not marked as ignorable (4 known properties: "date-added", "data", "name", "date-expires"]) 
at [Source: [email protected]; line: 23, column: 36] (through reference chain: 
com.company.model.Configuration["partner"]->java.util.HashSet[0]->com.company.model.PartnerConfiguration["config"] 
->java.util.HashSet[0]->com.company.model.HostConfiguration["cert"]->java.util.HashSet[0]->com.company.model.Certificate[""]) 
    at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:51) 
    at com.fasterxml.jackson.databind.DeserializationContext.reportUnknownProperty(DeserializationContext.java:817) 
    at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:958) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1324) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1302) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:249) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136) 
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245) 
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217) 
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25) 
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:523) 
    at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101) 
    at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:248) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136) 
    at com.fasterxml.jackson.dataformat.xml.deser.WrapperHandlingDeserializer.deserialize(WrapperHandlingDeserializer.java:120) 
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245) 
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217) 
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25) 
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:523) 
    at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101) 
    at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:248) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136) 
    at com.fasterxml.jackson.dataformat.xml.deser.WrapperHandlingDeserializer.deserialize(WrapperHandlingDeserializer.java:120) 
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245) 
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:217) 
    at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:25) 
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:523) 
    at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:101) 
    at com.fasterxml.jackson.databind.deser.impl.BeanPropertyMap.findDeserializeAndSet(BeanPropertyMap.java:285) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:248) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:136) 
    at com.fasterxml.jackson.dataformat.xml.deser.WrapperHandlingDeserializer.deserialize(WrapperHandlingDeserializer.java:120) 
    at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3534) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1936) 
    at com.fasterxml.jackson.dataformat.xml.XmlMapper.readValue(XmlMapper.java:196) 
    at com.fasterxml.jackson.dataformat.xml.XmlMapper.readValue(XmlMapper.java:171) 

回答

1

同时使用注释:

@JacksonXmlCData 
@JacksonXmlText 

它的伎俩。那很好!

+0

FWIW,第二个是读取(反序列化)所需的全部内容。第一个可能被用来确保它被序列化为CDATA,这也是有用的。 – StaxMan

+0

值得注意的是'JacksonXmlCData'是无条件的,所以所有的值都包含在CDATA标签中,而不仅仅是包含非分析字符的值。 – snakeoil