2012-10-27 11 views
6
<a> 
    <b1>b1</b1> 
    <b2>b2</b2> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
</a> 

olmadan tekrarlanan XmlElement, ben istisnaJAXB unmarshaller: Ben POJO Java Bean sınıfına XML dosyası okumak için Jackson <code>XmlMapper</code> kullandığınızda, <code><b3s></code> demek tüm <code><b3></code> bir sarıcı elemana yer almayan bu yana sarmalayıcı

var
com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class com.xxxxx] from String value; no single-String constructor/factory method (through reference chain: com.xxxx["xxx"]->com.xxx["xxx"]) 

Ne ek açıklama kullanmalıyım?

@XmlElement 
public List<B3> b3; 

cevap

0

Jackson B3 örneğine içine bir dize nasıl açılacağını bilmiyor. Tek bir String alır B3 için bir kurucu (veya bir B3 döndüren fabrika yöntemi) ekleyin. Yapıcı örneği: JAXB ek açıklamaları kullanarak eğer alternatif

@JacksonXmlElementWrapper(useWrapping=false) 

: Eğer "Çizelgesi" temsilini kullanmak istiyorsanız

class B3 { 
    // ... 
    public B3(String value) { 
     // do something with value 
    } 
    // ... 
} 

http://wiki.fasterxml.com/JacksonFeatureCreators

4

, sen Jackson 2.1 kullanmanız gerekir ve açılmamış seçeneği belirtmek varsayılan olarak sarma kullanılmamalıdır.

Son olarak, birlikte, sarıcı eleman kullanmamaya varsayılan değiştirebilirsiniz:

JacksonXmlModule module = new JacksonXmlModule(); 
// to default to using "unwrapped" Lists: 
module.setDefaultUseWrapper(false); 
XmlMapper xmlMapper = new XmlMapper(module); 
5

NOT

Jackson JAXB (JSR-222) uyumlu bir uygulama değildir. Bu standart JAXB yorumladığı konusunda garanti yoktur


Varsayılan olarak bir JAXB (JSR-222) uyumlu uygulama toplama özelliklerine bir sarıcı eleman geçerli değildir Ek açıklamalar anlamına gelir.

Varsayılan olarak JAXB (JSR-222) uygulaması özelliklerine göre eşleştirmeleri varsayılan olarak

A. Alandan tasarruf etmek için bu yöntemleri ihmal ettim ve @XmlAccessorType(XmlAccessType.FIELD) belirtildi, böylece meta veriler örnek değişkenlerinden (alanlardan) türetilecek.

package forum13097559; 

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class A { 

    private String b1; 
    private String b2; 
    private List<B3> b3; 

} 

B3

package forum13097559; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class B3 { 

    private String c1; 
    private String c2; 

} 

Deneme

package forum13097559; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(A.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum13097559/input.xml"); 
     A a = (A) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(a, System.out); 
    } 

} 

girişi.Daha Fazla Bilgi xml/Çıktı

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<a> 
    <b1>b1</b1> 
    <b2>b2</b2> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
    <b3> 
     <c1></c1> 
     <c2></c2> 
    </b3> 
</a> 

İlgili konular