2011-05-19 12 views
6

Bir üçüncü taraf XML yükünü bir sınıfa dönüştürmeye çalışıyorum. Sorun, yükün bir ebeveyn/çocuk ilişkisine sahip olması ve kök düğümü, ebeveynin ve çocukların hepsinin aynı eleman adına sahip olmasıdır. İşte yükün bir örneği. Kötü ebeveyn/alt model ile unmarshal xml iletisi nasıl kullanılır?

<?xml version="1.0" encoding="UTF-8"?> 
<Directory> 
    <id>2</id> 
    <name>Media</name> 
    <Directory> 
     <id>5</id> 
     <name>Default_Content</name> 
     <Directory> 
      <id>9</id> 
      <name>Images</name> 
     </Directory> 
     <Directory> 
      <id>8</id> 
      <name>Icons</name> 
     </Directory> 
     <Directory> 
      <id>6</id> 
      <name>Additional_Content</name> 
     </Directory> 
    </Directory> 
    <Directory> 
     <id>12</id> 
     <name>IC</name> 
    </Directory> 
</Directory> 

yüzden JAXB/JAX-RS işe yarar bir şey içine bu unmarshal böylece bir sınıf açıklama çalışıyorum.

Bu

@XmlRootElement(name="Directory") 
public class Directory { 
    private int id; 
    private String name; 

    @XmlElement(name="Directory"); 
    private List<Directory> directories = new ArrayList<Directory>(); 
} 

Ama böyle bir şey denedim, tahmin edilebileceği gibi, bunun nedeni aynı adla 2 özelliklere sahip bir IllegalAnnotationException atar.

JAXB/JAX-RS'yi nasıl kullanabileceğimize dair herhangi bir fikir bu karmaşayı net bir şekilde halledebilir mi yoksa sadece kendi başıma mı çözümlemem gerekir?

cevap

13

Kısa Cevap

istisna bir saha/mülk çarpışma nedeniyle. Sen özelliklerini (metotlarını olsun) açıklama ya da türüne şu ek açıklama ayarlayabilirsiniz ya:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Directory { 
    ... 
} 

Uzun Cevap

JAXB'ın varsayılan erişim türü bu JAXB (tüm kamu alanları harita anlamına gelir PUBLIC_MEMBER olduğunu örnek değişkenler) ve özellikler (get/set yöntemleri).

public class Foo { 

    private String bar; 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

} 

Eğer bir alan açıklama ise:

public class Foo { 

    @XmlAttribute 
    private String bar; 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

} 

Sonra JAXB eşlenen ve bir özel durum iki bar özelliklere sahiptir düşünecek:

Exception in thread "main" com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
Class has two properties of the same name "bar" 
    this problem is related to the following location: 
     at public java.lang.String example.Foo.getBar() 
     at example.Foo 
    this problem is related to the following location: 
     at private java.lang.String example.Foo.bar 
     at example.Foo 

çözüm açıklama etmektir özelliği ve XmlAccessType türünü FIELD

olarak ayarlayın.
@XmlAccessorType(XmlAccessType.FIELD) 
public class Foo { 

    @XmlAttribute 
    private String bar; 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

} 

Kişisel Modeli

Dizin

import java.util.ArrayList; 
import java.util.List; 

import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="Directory") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Directory { 
    private int id; 
    private String name; 

    @XmlElement(name="Directory") 
    private List<Directory> directories = new ArrayList<Directory>(); 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public List<Directory> getDirectories() { 
     return directories; 
    } 

    public void setDirectories(List<Directory> directories) { 
     this.directories = directories; 
    } 

} 

Demo

+2

Güzellik. Bir şampiyon gibi çalışır. Hızlı ve yararlı yanıt için teşekkürler. – jspyeatt

+1

+1. Çok iyi bir açıklama! – asgs