2012-09-05 13 views
5

Trong việc thực hiện JAXB tham chiếu là có anyway để có được XmlSeeAlso sử dụng tên = giá trị từ XmlRootElement?XmlSeeAlso và XmlRootElement tên?

Hiệu ứng tôi muốn là dành cho thuộc tính type để sử dụng tên = giá trị thay vì tên lớp thực tế từ XmlSeeAlso.

Có thể thực hiện một số JAXB khác không?

ví dụ nhỏ:

@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> 

thể mà không cần rất nhiều nỗ lực?

Trả lời

11

Về @XmlSeeAlso

Mục đích của @XmlSeeAlso chú thích chỉ để cho JAXB của bạn (JSR-222) thực hiện biết rằng khi nó được xử lý siêu dữ liệu cho Resource rằng nó cũng nên xử lý siêu dữ liệu cho các SomeItem là lớp học. Một số người nhầm tưởng rằng nó liên quan đến kế thừa bản đồ vì đó là trường hợp sử dụng nó thường được sử dụng nhất. Vì các lớp con của một lớp không thể được xác định bằng cách sử dụng sự phản chiếu Java, nên @XmlSeeAlso được sử dụng để cho phép thực hiện JAXB biết rằng các ánh xạ cho các lớp con cũng sẽ được tạo ra.


Dưới đây là một ví dụ về cách bạn có thể hỗ trợ trường hợp sử dụng của bạn:

Resource

Tên loại phức tạp tương ứng với một lớp Java được cung cấp thông qua @XmlType chú thích.

package forum12288631; 

import javax.xml.bind.annotation.XmlType; 

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

} 

Demo tên phần tử

Gốc có thể đến từ các @XmlRootElement chú thích hoặc có thể được cung cấp thông qua một thể hiện của JAXBElement. Chúng tôi sẽ tạo một phiên bản JAXBElement và cho biết rằng nó đang giữ một phiên bản Object. Khi marshalled này sẽ cho các thuộc tính xsi:type được bao gồm trong đầu ra.

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); 
    } 

} 

Output

XML kết quả có phần tử gốc được cung cấp bởi các JAXBElement và giá trị của thuộc tính xsi:type xuất phát từ @XmlType chú thích trên Resource.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="some_item"/> 
Các vấn đề liên quan