2012-09-05 22 views
5

Referans JAXB uygulamasında, XmlSeeAlso'nun XmlRootElement öğesinden name = değerini kullanması için herhangi bir yol var mı?XmlSeeAlso ve XmlRootElement adları?

İstediğim etki, type özniteliğinin XmlSeeAlso'dan gerçek sınıf adı yerine name = değerini kullanmasıdır.

Bu, başka bir JAXB uygulaması mıdır?

Küçük bir örnek:

çaba olmadan Olası
@XmlRootElement(name="some_item") 
public class SomeItem{...} 

@XmlSeeAlso({SomeItem.class}) 
public class Resource {...} 

XML: 
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item"> 
... 
</resource> 

?

cevap

11

Hakkında @XmlSeeAlso

@XmlSeeAlso açıklama amacı sadece JAXB (JSR-222) uygulaması bu Resource için meta işlerken aynı zamanda SomeItem için meta işlemek gerektiğini bildirmek için sınıf. Bazı insanlar yanlışlıkla en yaygın olarak kullanılan kullanım durumu olduğundan, mirasın haritalandırılması ile ilgili olduğuna inanmaktadırlar. Bir sınıfın alt sınıfları Java yansıması kullanılarak belirlenemediğinden, JAXB uygulamasının alt sınıflar için eşlemelerin de oluşturulmasını bilmesi için @XmlSeeAlso kullanılır.

Kaynak

bir Java sınıfına tekabül karmaşık tür adı @XmlType ek açıklaması yoluyla beslenir:


Aşağıda, kullanım örneğini destekleyecek nasıl bir örneğidir.

package forum12288631; 

import javax.xml.bind.annotation.XmlType; 

@XmlType(name="some_item") 
public class Resource { 

} 

Demo

kök öğesi adı @XmlRootElement açıklama gelebilir ya JAXBElement örneği aracılığıyla temin edilebilir. JAXBElement örneğini oluşturacağız ve bunun Object örneğini tuttuğunu göstereceğiz. Marshalled zaman bu çıktıya dahil edilecek xsi:type özniteliği için olacaktır.

package forum12288631; 

import javax.xml.bind.*; 
import javax.xml.namespace.QName; 

public class Demo { 

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

     Resource resource = new Resource(); 
     JAXBElement<Object> jaxbElement = new JAXBElement<Object>(QName.valueOf("resource"), Object.class, resource); 

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

} 

Çıktı

sonuç XML Resource üzerinde @XmlType açıklama geliyor JAXBElement ve xsi:type özelliği değeriyle verilen kök öğesi vardır.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item"/>