|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
java.lang.Object javax.xml.bind.JAXBContext
public abstract class JAXBContext
JAXBContext 類別提供到 JAXB API 的客戶端入口點。它提供了管理實作 JAXB 綁定框架操作所需的 XML/Java 綁定資訊的抽象,這些操作包括:解組、編組和驗證。
客戶端應用程序通常使用以下兩種樣式的 newInstance 方法之一來獲得此類別的新實例,但是該方法還有其他可用的特殊形式:
JAXBContext.newInstance( "com.acme.foo:com.acme.bar" )
JAXBContext.newInstance( com.acme.foo.Foo.class )
newInstance(Class...)
。
特別要求:該提供者必須提供包含以下方法簽章的實作類別:public static JAXBContext createContext( String contextPath, ClassLoader classLoader, Mapproperties ) throws JAXBException public static JAXBContext createContext( Class[] classes, Map properties ) throws JAXBException 以下 JAXB 1.0 要求只是 java 介面/實作綁定的網要所需要的。它不適用於 JAXB 註釋類別。JAXB 提供者必須在每個包含網要派生類別的套件中產生一個 jaxb.properties 檔案。該屬性檔案必須包含名為 javax.xml.bind.context.factory 的屬性,其值為實作 createContext API 的類別的名稱。
該提供者提供的類別不一定是可分派給 javax.xml.bind.JAXBContext 的,只是必須提供一個實作 createContext API 的類別。
此外,提供者必須在執行 marshal 和 unmarshal 方法的任何客戶端調用之前調用
DatatypeConverter.setDatatypeConverter
api。這在配置將在執行這些操作期間使用的資料型別轉換器時是必需的。
Unmarshaller
類別使客戶端應用程序能夠將 XML 資料轉換為 Java 內容物件階層樹。unmarshal 方法允許將網要中宣告的任何全體 XML 元素解組為實例文檔的根。此外,unmarshal 方法允許將未被識別的根元素(該元素具有一個參考了網要中宣告的型別定義的 xsi:type 屬性值)解組為實例文檔的根。JAXBContext 物件允許跨網要集合(已在 contextPath 中列出)合併全體元素和型別定義。因為網要集合中的每個網要可能屬於不同的名稱空間,所以統一解組上下文的網要應該與名稱空間無關。這意味著客戶端應用程序能夠解組 contextPath 中列出的任何網要實例的 XML 文檔。例如:JAXBContext jc = JAXBContext.newInstance( "com.acme.foo:com.acme.bar" ); Unmarshaller u = jc.createUnmarshaller(); FooObject fooObj = (FooObject)u.unmarshal( new File( "foo.xml" ) ); // ok BarObject barObj = (BarObject)u.unmarshal( new File( "bar.xml" ) ); // ok BazObject bazObj = (BazObject)u.unmarshal( new File( "baz.xml" ) ); // error, "com.acme.baz" not in contextPath客戶端應用程序還可以顯式產生 Java 內容階層樹,而不是解組現有的 XML 資料。對於所有 JAXB 註釋值類別,應用程序可以使用建構子來創建內容。對於網要派生的介面/實作類別以及未綁定到 JAXB 註釋類別的元素的創建,應用程序需要存取和瞭解每個網要派生的 ObjectFactory 類別,這些類別存在於 contextPath 中包含的每個 java 套件中。對於每個網要派生的 java 類別,都有一個產生該型別的物件的靜態處理器方法。例如,假定在編譯網要之後有一個套件 com.acme.foo,它包含一個名為 PurchaseOrder 的網要派生介面。為了創建該型別的物件,客戶端應用程序將使用如下處理器方法:
com.acme.foo.PurchaseOrder po = com.acme.foo.ObjectFactory.createPurchaseOrder();一旦客戶端應用程序有一個網要派生物件的實例,它就可以使用 mutator 方法在該實例上設置內容。
有關產生的 ObjectFactory 類別的更多資訊,請參閱該規範的第 4.2 節「Java 套件」。
特別要求:在包含名為 ObjectFactory 的套件所需的所有物件處理器方法以及靜態 newInstance( javaContentInterface ) 方法的每個包中,該提供者都必須產生一個類別。
編組
Marshaller
類別使客戶端應用程序能夠將 Java 內容階層樹轉換回 XML 資料。對使用處理器方法手動創建的內容階層樹進行編組與對作為 unmarshal 操作結果的內容階層樹進行編組沒有什麼區別。客戶端可以將 java 內容階層樹編組回 java.io.OutputStream 或 java.io.Writer 的 XML 資料。編組進程可以產生已註冊 ContentHandler 的 SAX2 事件串流,也可以產生一個 DOM 節點物件。客戶端應用程序控制著輸出編碼,還控制著是將 XML 資料編組為一個完整的文檔還是編組為一個片段。下面是一個解組 XML 文檔、然後將其編組回來的簡單範例:
JAXBContext jc = JAXBContext.newInstance( "com.acme.foo" ); // unmarshal from foo.xml Unmarshaller u = jc.createUnmarshaller(); FooObject fooObj = (FooObject)u.unmarshal( new File( "foo.xml" ) ); // marshal to System.out Marshaller m = jc.createMarshaller(); m.marshal( fooObj, System.out );
驗證
自 JAXB 1.0 以後,驗證已經發生了很大的變化。Validator
類別已經廢棄,成為了一個可選項。這意味著建議您不要使用此類別,實際上,根據您的 JAXB 提供者,該類別甚至根本不可用。在 JAXB 1.0 運行時系統上進行部署時,依賴 Validator 的 JAXB 1.0 客戶端仍然可以正常工作。在 JAXB 2.0 中,Unmarshaller
已包括一些公開 JAXP 1.3javax.xml.validation
框架的便捷方法。有關詳細資訊,請參閱Unmarshaller.setSchema(javax.xml.validation.Schema)
API。
JAXB 運行時綁定框架的相容性
以下 JAXB 1.0 限制僅適用於將網要綁定到介面/實作類別。因為此綁定不需要通用的運行時系統,所以 JAXB 客戶端應用程序不必嘗試混合使用不同的提供者提供的運行時物件(JAXBContext、Marshaller 等)。這並不意味著客戶端應用程序是不可移植的,只是意味著客戶端必須使用由用來編譯網要的同一提供者提供的運行時系統。
Marshaller
,
Unmarshaller
,
S 7.4.1.1 "Package Annotations" in Java Language Specification, 3rd Edition欄位摘要 | |
---|---|
static String |
JAXB_CONTEXT_FACTORY
屬性名稱,它包含能夠創建新的 JAXBContext 物件的類別名稱。 |
建構子摘要 | |
---|---|
protected |
JAXBContext()
|
方法摘要 | ||
---|---|---|
Binder<Node> |
createBinder()
為 W3C DOM 創建一個 Binder。 |
|
|
createBinder(Class<T> domType)
創建一個可用於關聯/原地解組/編組操作的 Binder 物件。 |
|
JAXBIntrospector |
createJAXBIntrospector()
創建一個可以用於內省 JAXB 物件的 JAXBIntrospector 物件。 |
|
abstract Marshaller |
createMarshaller()
創建一個可以用來將 java 內容階層樹轉換為 XML 資料的 Marshaller 物件。 |
|
abstract Unmarshaller |
createUnmarshaller()
創建一個可以用來將 XML 資料轉換為 java 內容階層樹的 Unmarshaller 物件。 |
|
abstract Validator |
createValidator()
已過時。 從 JAXB 2.0 開始 |
|
void |
generateSchema(SchemaOutputResolver outputResolver)
產生此上下文的網要文檔。 |
|
static JAXBContext |
newInstance(Class... classesToBeBound)
獲得 JAXBContext 類別的新實例。 |
|
static JAXBContext |
newInstance(Class[] classesToBeBound,
Map<String,?> properties)
獲得 JAXBContext 類別的新實例。 |
|
static JAXBContext |
newInstance(String contextPath)
獲得 JAXBContext 類別的新實例。 |
|
static JAXBContext |
newInstance(String contextPath,
ClassLoader classLoader)
獲得 JAXBContext 類別的新實例。 |
|
static JAXBContext |
newInstance(String contextPath,
ClassLoader classLoader,
Map<String,?> properties)
獲得 JAXBContext 類別的新實例。 |
從類別 java.lang.Object 繼承的方法 |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
欄位詳細資訊 |
---|
public static final String JAXB_CONTEXT_FACTORY
建構子詳細資訊 |
---|
protected JAXBContext()
方法詳細資訊 |
---|
public static JAXBContext newInstance(String contextPath) throws JAXBException
獲得 JAXBContext 類別的新實例。
這是 newInstance
方法的一個便捷方法。它使用當前執行緒的上下文類別載入器。要指定如何使用不同的類別載入器,可以通過 Thread.setContextClassLoader() api 設置它,或者使用 newInstance
方法。
JAXBException
- 如果在創建 JAXBContext 時遇到錯誤,比如:
public static JAXBContext newInstance(String contextPath, ClassLoader classLoader) throws JAXBException
獲得 JAXBContext 類別的新實例。
客戶端應用程序必須提供上下文路徑,該路徑是一個冒號 (':', \u003A) 分隔的 java 套件名稱列表,它包含網要派生類別和/或完全限定的 JAXB 註釋類別。網要派生的程式碼是通過為每個包產生的 ObjectFactory.class 在 JAXBContext 中註冊的。開發人員註釋的 JAXB 映射類別在 jaxb.index 資源檔案中列出,而不是在上下文路徑中列出,列出這些類別所採用的格式如下所述。注意,java 套件可以包含網要派生類別和使用者註釋 JAXB 類別。此外,java 套件可能包含必須處理的 JAXB 套件註釋。(請參閱 JLS 第 3 版的第 7.4.1 節“包註釋”)。
每個 contextPath 上列出的套件都必須滿足下面的一個或兩個條件,否則將拋出 JAXBException:
jaxb.index 的格式
該檔案應該套件含換行符分隔的類別名稱列表。空格、製表符和空行被忽略。註釋字元是 '#' (0x23);每行上的第一個註釋字元後面的所有字元都被忽略。檔案必須使用 UTF-8 編碼。從列出的類別中獲得的類別也可以在 JAXBContext 中註冊,正如 newInstance(Class...)
定義的那樣。
對 jaxb.index 檔案中出現的類別名稱的限制是:
為了維護與將 JAXB 1.0 網要綁定到 java 介面/實作的相容(可通過將網要自定義為 jaxb:globalBindings valueClass="false" 來啟用此綁定), JAXB 提供者需要確保上下文路徑上的每個包都有一個 jaxb.properties 檔案,該檔案包含一個 javax.xml.bind.context.factory 屬性值,以及解析為相同提供者的所有值。
此要求不適用於 JAXB 註釋類別。如果 contextPath 上列出的各種包之間存在任何全體 XML 元素名稱衝突,則將拋出 JAXBException。
在相同的上下文路徑中混合使用從多個 JAXB 提供者中產生的介面/實作綁定可能導致拋出 JAXBException。
contextPath
- 套件含網要派生類別和/或 java 網要(JAXB 註釋)映射類別的 java 套件名稱的列表classLoader
- 此類別載入器將用於定位實作類別。
JAXBException
- 如果創建 JAXBContext 時遇到錯誤,如下所示:
public static JAXBContext newInstance(String contextPath, ClassLoader classLoader, Map<String,?> properties) throws JAXBException
獲得 JAXBContext 類別的新實例。
多數情況下,這與 newInstance(String, ClassLoader)
相同,但此版本允許傳入特定於提供者的屬性來配置 JAXBContext
的實例。
屬性的解釋取決於實作。
contextPath
- 套件含網要派生類別的 java 套件名稱的列表classLoader
- 此類別載入器將用於定位實作類別。properties
- 特定於提供者的屬性
JAXBException
- 如果創建 JAXBContext 時遇到錯誤,如下所示:
public static JAXBContext newInstance(Class... classesToBeBound) throws JAXBException
獲得 JAXBContext 類別的新實例。
客戶端應用程序必須提供新上下文物件需要識別的類別的列表。
新的上下文不僅要識別所有指定的類別,還要識別直接/間接從指定類別中靜態參考的全部類別。所參考類別的子類別或 @XmlTransient 參考類別都不用在 JAXBContext 中註冊。例如,在下面的 Java 程式碼中,如果執行 newInstance(Foo.class),則新創建的 JAXBContext
將識別 Foo 和 Bar,但不識別 Zot 或 FooBar:
class Foo { @XmlTransient FooBar c; Bar b; } class Bar { int x; } class Zot extends Bar { int y; } class FooBar { }因此,典型的客戶端應用程序只需指定最高層類別,但需要小心。
注意,對於每個在 JAXBContext 中註冊的 java 套件,當存在可選的套件註釋時,必須對它們進行處理。(請參閱 JLS 第 3 版的第 7.4.1 節“包註釋”)。
classesToBeBound
- 將通過新的 JAXBContext
識別的 java 類別的列表。可以為空,在這種情況下,將返回只知道規範中定義的類別的 JAXBContext
。
JAXBException
- 如果創建 JAXBContext 時遇到錯誤(但不限於這些錯誤),如下所示:
IllegalArgumentException
- 如果參數中包含 null
(即 newInstance(null);
)public static JAXBContext newInstance(Class[] classesToBeBound, Map<String,?> properties) throws JAXBException
獲得 JAXBContext 類別的新實例。
可重載 newInstance(Class...)
來配置「屬性」,以實例化 JAXBContext
。
屬性的解釋是特定於實作的。
classesToBeBound
- 將通過新 JAXBContext
識別的 java 類別的列表。可以為空,在這種情況下,將返回只知道規範中定義的類別的 JAXBContext
。
JAXBException
- 如果創建 JAXBContext 時遇到錯誤(但不限於這些錯誤),比如:
IllegalArgumentException
- 如果參數中包含 null
(即 newInstance(null);
)public abstract Unmarshaller createUnmarshaller() throws JAXBException
JAXBException
- 如果創建 Unmarshaller 物件時遇到錯誤public abstract Marshaller createMarshaller() throws JAXBException
JAXBException
- 如果創建 Marshaller 物件時遇到錯誤public abstract Validator createValidator() throws JAXBException
Validator
已成為一個可選項,並且在 JAXB 2.0 中已過時。有關詳細資訊,請參閱 Validator
的 javadoc。
創建一個可用於根據源網要驗證 java 內容階層樹的 Validator 物件。
JAXBException
- 如果創建 Validator 物件時遇到錯誤public <T> Binder<T> createBinder(Class<T> domType)
domType
- 選擇通過傳入其 DOM 節點類別獲得使用的 DOM API。
UnsupportedOperationException
- 如果該實作不支持對應於 domType 的 DOM API。public Binder<Node> createBinder()
public JAXBIntrospector createJAXBIntrospector()
UnsupportedOperationException
- 在 JAXB 1.0 實作上調用此方法將拋出 UnsupportedOperationException。public void generateSchema(SchemaOutputResolver outputResolver) throws IOException
outputResolver
- 此物件控制網要將被發送的輸出。
IOException
- 如果 SchemaOutputResolver
拋出 IOException
。
UnsupportedOperationException
- 在 JAXB 1.0 實作上調用此方法將拋出 UnsupportedOperationException。
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
上一個類別 下一個類別 | 框架 無框架 | |||||||||
摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 |
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。