2012-07-17 23 views
35

karşı. Ben sadece bir kez kullanılacak olduğunda yapısı bir XML şeması içinde ve @XMLRootElement ile birden fazla kez kullanılacaktır zaman @XMLType ile sınıfları annotating oldum - bu en iyi yaklaşımdır? Burada ekleriz@XMLRootElement <code>@XMLRootElement</code> ve <code>@XMLType</code> sahip bir sınıf annotating arasındaki fark nedir @XmlType

farklı ancak ilişkili bir soru. @XMLType ek açıklamasının, öğelerinin hangi sırada görüneceğini belirtmek için bir propOrder özniteliği vardır - @XMLRootElement için bir eşdeğer var mı?

Bu ek açıklamaları, fark yaratan web hizmetleri oluşturmak için JAX-WS ek açıklamalarıyla birlikte kullanıyorum.

cevap

17

XmlRootElement ve XmlType arasındaki fark kapsam belirleme meselesidir. Unutmayın bu açıklama sadece XML'inizi oluşturmak için kullanılan şemanın oluşturulmasını dikte ediyor. XmlRootElement (anonim veya şema tip) bir global öğesini belirtmektedir:

<xs:element name=foo type="bar"> </xs:element> <-- schema type 

XmlType (anonim veya karmaşık tip) yerel bir parçanın ifade edilmesi için kullanılır ise:

<xs:complexType name=bar> </xs:complexType> <-- complex type 

ana Buradaki yerel/global farklar, nesnenizin görüneceği şemanın hiyerarşisinde ve şema türü veya karmaşık bir türün bildirildiğini belirtir. bu açıklamaları her ikisi için dokümantasyon iyi yazılmış ve örnekler içerir:

XmlRootElement

XmlType

DÜZENLEME: propOrder soru adresleme: Ayrıca yerel ilan edilir eğer küresel bir eleman üzerinde kullanabilirsiniz türü:

@XmlRootElement (name="PersonElement") 
@XmlType (propOrder={"firstname", "lastname"}) 
public class People{ 
    @XmlElement 
    public String firstname; 
    public String lastname; 
} 

Bu verecektir gibi bir şey:

yapı, yalnızca bir kez kullanılacak zaman bir XML şeması içinde ve @XMLRootElement ile birden fazla kez kullanılabilir olacak zaman
17

Ben @XMLType sınıfları annotating oldum - bu en iyi yaklaşımdır? bilmek

Bir şey @XmlRootElement veya @XmlType açıklama ne gerekli olmasıdır. JPA'dan @Entity eşdeğeri değiller. Sen ne kadar şimdiye kadar hiçbir ek açıklaması olmayan bir JAXB (JSR-222) uygulamasını kullanabilirsiniz: I Aşağıda

@XmlRootElement ve @XmlType ne açıklayacağız.senin JAXB uygulama sadece işleniyor XML öğesi dayalı bir nesnenin örneğini gerektiğinde


@XmlRootElement

kez vardır. @XmlRootElement ek açıklaması, bu ilişkilendirmeyi belirtmenin birincil yoludur. öncelikle kök nesnesini belirtmek için kullanılır Kök Nesne

@XmlRootElement belirtme - Bir sınıf birden fazla XML öğesi sonra @XmlElementDecl açıklama kullanılmalıdır insteat,

ROLÜ 1. karşılık gelip gelmediğini unutmayın. Bu, JAXB uygulamanızın bir XML belgesini unshashall etmeye başladığında, hangi nesneyi başlatacağını bilir. Hemen sonraki tüm ek açıklamalar, ana sınıftan toplanan bilgilere dayanacaktır.

Foo

@XmlRootElement(name="root") 
public class Foo { 

    private String name; 

} 

Bar

public class Bar { 

    private String name; 

} 

XML

<root> 
    <name>Jane Doe</name> 
</root> 

Deneme

Foo foo = (Foo) unmarshaller.unmarshal(xml); 
Bar bar = unmarshaller.unmarshal(xml, Bar.class).getValue(); 

ROLÜ # 2 - ikame grupları

@XmlElementRef açıklama delegeler adı örneği nesne türü/elemanın uri. Bu, kalıtımı temsil eden ikame grupları kavramına eşlemeyi mümkün kılar.

ROLÜ # 3 - Herhangi İçerik

@XmlAnyElement Eğer XML belgesinin bir vahşi kart bölümü harita sağlar. @XmlAnyElement(lax=true) belirtirseniz, etki alanı nesneleriyle ilişkilendirilmiş öğeler karşılık gelen etki alanı nesnesine dönüştürülür.


@XmlType

ROLÜ # 1 - Şema Gen adlandırılmış karmaşık tür bilinen her Java sınıfı için oluşturulan Varsayılan olarak

JAXB içeriği. @XmlType ek açıklamasını kullanarak bu türün adını denetleyebilir veya adı, "" olarak belirterek anonim karmaşık bir türün oluşturulacağını belirtebilirsiniz.

ROLÜ # 2 - Veraset ve xsi: tip

varsayılan JAXB tarafından miras göstergesi olarak xsi:type niteliğini yararlanır. Bu öznitelikteki değer, @XmlType ek açıklamasında belirttiğiniz ad ve ad alanına karşılık gelir veya sınıfa dayanarak varsayılan değerdir.

ROLÜ # 3 - Eğer mülkiyet sırasını belirlemek için @XmlType kullanabilirsiniz söz gibi al

Prop.

ROLÜ # 4 - Fabrika Yöntemleri

@XmlType varsayılan yerine alanı nesne örneğini oluşturmak için kullanılabilecek bir fabrika sınıfı ve/veya yöntemi belirlemenizi sağlar yapıcı. http://blog.bdoughan.com/2011/06/jaxb-and-factory-methods.html


Burada ekleriz farklı ancak ilişkili soru

  • . @XMLType ek açıklamasının hangi sırayla öğesinin göründüğünü belirtmek için bir propOrder özniteliği vardır - @XMLRootElement için bir eşdeğer var mı?

Hayır, propOrder boyutu, @XmlType ek açıklamasına aittir. Bu, karmaşık tiplerin bir (veya eksik) emrin belirlenmesinden sorumlu olmasından dolayı anlamlıdır. Elbette bu ek açıklamaları aynı anda kullanabilirsiniz.

@XmlRootElement 
@XmlType(propOrder={"foo", "bar"} 
public class Root { 
    ... 
} 
İlgili konular