Java 中文官方教程 2022 版(四十八)(4)

简介: Java 中文官方教程 2022 版(四十八)

Java 中文官方教程 2022 版(四十八)(3)https://developer.aliyun.com/article/1488519

课程:JAXB 简介

原文:docs.oracle.com/javase/tutorial/jaxb/intro/index.html

Java Architecture for XML Binding (JAXB)提供了一种快速便捷的方式来绑定 XML 模式和 Java 表示,使 Java 开发人员能够轻松地在 Java 应用程序中整合 XML 数据和处理功能。作为这个过程的一部分,JAXB 提供了将 XML 实例文档解组(读取)为 Java 内容树的方法,然后将 Java 内容树重新组合(写入)为 XML 实例文档的方法。JAXB 还提供了一种从 Java 对象生成 XML 模式的方法。

JAXB 2.0 对 JAXB 1.0 进行了几项重要改进:

  • 支持所有 W3C XML Schema 功能。(JAXB 1.0 没有为一些 W3C XML Schema 功能指定绑定。)
  • 支持将 Java 绑定到 XML,通过添加javax.xml.bind.annotation包来控制此绑定。(JAXB 1.0 规定了 XML Schema 到 Java 的映射,但没有规定 Java 到 XML Schema 的映射。)
  • 生成的基于模式的类数量显著减少。
  • 通过 JAXP 1.3 验证 API 提供的额外验证功能。
  • 更小的运行时库。

本课程描述了 JAXB 架构、功能和核心概念,并提供了使用 JAXB 的逐步示例过程。

JAXB 架构

原文:docs.oracle.com/javase/tutorial/jaxb/intro/arch.html

本节描述了 JAXB 处理模型中的组件和交互。

架构概述

以下图显示了构成 JAXB 实现的组件。

图:JAXB 架构概述


JAXB 实现由以下架构组件组成:

  • 模式编译器:将源模式绑定到一组基于模式的程序元素。绑定由基于 XML 的绑定语言描述。
  • 模式生成器:将一组现有程序元素映射到一个派生模式。映射由程序注解描述。
  • 绑定运行时框架:提供了用于访问、操作和验证 XML 内容的解组(读取)和组装(写入)操作,使用基于模式的或现有程序元素。

JAXB 绑定过程

以下图显示了 JAXB 绑定过程中发生的情况。

图:JAXB 绑定过程中的步骤


JAXB 数据绑定过程中的一般步骤如下:

  1. 生成类:将 XML 模式用作 JAXB 绑定编译器的输入,以根据该模式生成基于 JAXB 的类。
  2. 编译类:所有生成的类、源文件和应用程序代码都必须被编译。
  3. Unmarshal:根据源模式中的约束编写的 XML 文档由 JAXB 绑定框架解组。请注意,JAXB 还支持从文件和文档以外的源解组 XML 数据,如 DOM 节点、字符串缓冲区、SAX 源等。
  4. 生成内容树:解组过程生成从生成的 JAXB 类实例化的数据对象内容树;此内容树表示源 XML 文档的结构和内容。
  5. 验证(可选):解组过程涉及在生成内容树之前验证源 XML 文档。请注意,如果您在第 6 步中修改内容树,您还可以使用 JAXB 验证操作在将内容组装回 XML 文档之前验证更改。
  6. 处理内容:客户端应用程序可以通过使用绑定编译器生成的接口修改 Java 内容树表示的 XML 数据。
  7. Marshal:处理后的内容树被组装成一个或多个 XML 输出文档。在组装之前可能会进行验证。

更多关于 Unmarshalling

Unmarshalling 提供了客户端应用程序将 XML 数据转换为基于 JAXB 的 Java 对象的能力。

更多关于 Marshalling

Marshalling 提供了客户端应用程序将基于 JAXB 的 Java 对象树转换为 XML 数据的能力。

默认情况下,Marshaller在生成 XML 数据时使用 UTF-8 编码。

在组合之前,客户端应用程序不需要验证 Java 内容树。也没有要求 Java 内容树在组合成 XML 数据时必须符合其原始模式。

更多关于验证

验证是验证 XML 文档是否符合模式中表达的所有约束的过程。JAXB 1.0 在解组时提供了验证,并且还可以在 JAXB 内容树上按需进行验证。JAXB 2.0 只允许在解组和组合时进行验证。Web 服务处理模型是在读取数据时宽松,在写出数据时严格。为了符合该模型,在组合时添加了验证,以便用户可以确认在修改 JAXB 表单中的文档时未使 XML 文档无效。

表示 XML 内容

原文:docs.oracle.com/javase/tutorial/jaxb/intro/repcon.html

本节描述了 JAXB 如何将 XML 内容表示为 Java 对象。

XML 模式的 Java 表示

JAXB 支持将生成的类分组到 Java 包中。一个包包括以下内容:

  • 从 XML 元素名称派生的 Java 类名称,或者由绑定自定义指定。
  • 一个ObjectFactory类,这是一个工厂,用于返回绑定的 Java 类的实例。

绑定 XML 模式

原文:docs.oracle.com/javase/tutorial/jaxb/intro/bind.html

本节描述了 JAXB 使用的默认 XML 到 Java 绑定。所有这些绑定都可以通过使用自定义绑定声明全局或逐案例地进行覆盖。有关默认 JAXB 绑定的完整信息,请参阅JAXB 规范

简单类型定义

使用简单类型定义的模式组件通常绑定到 Java 属性。由于有不同类型的模式组件,以下 Java 属性属性(对于模式组件通用)包括:

  • 基本类型
  • 集合类型,如果有的话
  • 谓词

其余的 Java 属性属性在使用simple类型定义的模式组件中指定。

默认数据类型绑定

以下部分解释了默认模式到 Java、JAXBElement和 Java 到模式数据类型绑定。

模式到 Java 的映射

Java 语言提供了比 XML 模式更丰富的数据类型。以下表格提供了 JAXB 中 XML 数据类型到 Java 数据类型的映射。

表:XML 模式内置数据类型的 JAXB 映射

XML 模式类型 Java 数据类型
xsd:string java.lang.String
xsd:integer java.math.BigInteger
xsd:int int
xsd.long long
xsd:short short
xsd:decimal java.math.BigDecimal
xsd:float float
xsd:double double
xsd:boolean boolean
xsd:byte byte
xsd:QName javax.xml.namespace.QName
xsd:dateTime javax.xml.datatype.XMLGregorianCalendar
xsd:base64Binary byte[]
xsd:hexBinary byte[]
xsd:unsignedInt long
xsd:unsignedShort int
xsd:unsignedByte short
xsd:time javax.xml.datatype.XMLGregorianCalendar
xsd:date javax.xml.datatype.XMLGregorianCalendar
xsd:g javax.xml.datatype.XMLGregorianCalendar
xsd:anySimpleType java.lang.Object
xsd:anySimpleType java.lang.String
xsd:duration javax.xml.datatype.Duration
xsd:NOTATION javax.xml.namespace.QName

JAXBElement 对象

当无法通过 XML 内容的派生 Java 表示来推断 XML 元素信息时,会提供一个JAXBElement对象。该对象具有获取和设置对象名称和对象值的方法。

Java 到模式的映射

以下表格显示了 Java 类到 XML 数据类型的默认映射。

表:XML 数据类型到 Java 类的 JAXB 映射

Java 类 XML 数据类型
java.lang.String xs:string
java.math.BigInteger xs:integer
java.math.BigDecimal xs:decimal
java.util.Calendar xs:dateTime
java.util.Date xs:dateTime
javax.xml.namespace.QName xs:QName
java.net.URI xs:string
javax.xml.datatype.XMLGregorianCalendar xs:anySimpleType
javax.xml.datatype.Duration xs:duration
java.lang.Object xs:anyType
java.awt.Image xs:base64Binary
javax.activation.DataHandler xs:base64Binary
javax.xml.transform.Source xs:base64Binary
java.util.UUID xs:string

自定义生成的类和 Java 程序元素

原文:docs.oracle.com/javase/tutorial/jaxb/intro/customize.html

以下部分描述了如何自定义生成的 JAXB 类和 Java 程序元素。

模式到 Java

自定义 JAXB 绑定声明使您能够在 XML 模式中包含 Java 特定的细化,例如类和包名称映射,以定制生成的 JAXB 类。

JAXB 提供了两种自定义 XML 模式的方法:

  • 作为源 XML 模式中的内联注释
  • 作为传递给 JAXB 绑定编译器的外部绑定自定义文件中的声明

提供了显示如何自定义 JAXB 绑定的代码示例,稍后在本文档中提供。

Java 到模式

javax.xml.bind.annotation 包中定义的 JAXB 注释可用于自定义 Java 程序元素到 XML 模式的映射。以下表总结了可以与 Java 包一起使用的 JAXB 注释。

表:与 Java 包相关的 JAXB 注释

注释 描述和默认设置

| @XmlSchema | 将包映射到 XML 目标命名空间。默认设置:

@XmlSchema ( 
    xmlns = {}, 
    namespace = "", 
    elementFormDefault = XmlNsForm.UNSET, 
    attributeFormDefault = XmlNsForm.UNSET
)

|

| @XmlAccessorType | 控制字段和属性的默认序列化。默认设置:

@XmlAccessorType (
    value = AccessType.PUBLIC_MEMBER 
)

|

| @XmlAccessorOrder | 控制映射到 XML 元素的属性和字段的默认排序。默认设置:

@XmlAccessorOrder (
    value = AccessorOrder.UNDEFINED
)

|

| @XmlSchemaType | 允许自定义映射到 XML 模式内置类型。默认设置:

@XmlSchemaType (
    namespace = 
    "http://www.w3.org/2001/XMLSchema", 
    type = DEFAULT.class
)

|

@XmlSchemaTypes 用于定义多个 @XmlSchemaType 注释的容器注释。默认设置:无

以下表总结了可以与 Java 类一起使用的 JAXB 注释。

表:与 Java 类相关的 JAXB 注释

注释 描述和默认设置

| @XmlType | 将 Java 类映射到模式类型。默认设置:

@XmlType (
    name = "##default", 
    propOrder = {""}, 
    namespace = "##default", 
    factoryClass = DEFAULT.class, 
    factoryMethod = ""
)

|

| @XmlRootElement | 将全局元素与类映射到的模式类型关联。默认设置:

@XmlRootElement (
    name = "##default", 
    namespace = "##default" 
)

|

以下表总结了可以与 Java enum 类型一起使用的 JAXB 注释。

表:与 Java enum 类型相关的 JAXB 注释

注释 描述和默认设置

| @XmlEnum | 将 Java 类型映射到 XML 简单类型。默认设置:

@XmlEnum ( value = String.class )

|

@XmlEnumValue 将 Java 类型映射到 XML 简单类型。默认设置:无

| @XmlType | 将 Java 类映射到模式类型。默认设置:

@XmlType (
    name = "##default", 
    propOrder = {""}, 
    namespace = "##default", 
    factoryClass = DEFAULT.class, 
    factoryMethod = ""
)

|

| @XmlRootElement | 将全局元素与类映射到的模式类型关联。默认设置:

@XmlRootElement (
    name = "##default", 
    namespace = "##default" 
)

|

以下表总结了可以与 Java 属性和字段一起使用的 JAXB 注释。

表:与 Java 属性和字段相关的 JAXB 注释

注释 描述和默认设置

| @XmlElement | 将 JavaBeans 属性或字段映射到从属性或字段名称派生的 XML 元素。默认设置:

@XmlElement (
    name = "##default", 
    nillable = false, 
    namespace = "##default", 
    type = DEFAULT.class, 
    defaultValue = "\u0000"
)

|

@XmlElements 用于定义多个 @XmlElement 注解的容器注解。默认设置:无

| @XmlElementRef | 将 JavaBeans 属性或字段映射到从属性或字段类型派生的 XML 元素。默认设置:

@XmlElementRef (
    name = "##default", 
    namespace = "##default", 
    type = DEFAULT.class
)

|

@XmlElementRefs 用于定义多个 @XmlElementRef 注解的容器注解。默认设置:无

| @XmlElementWrapper | 在 XML 表示周围生成一个包装器元素。通常用作集合周围的包装 XML 元素。默认设置:

@XmlElementWrapper (
    name = "##default", 
    namespace = "##default", 
    nillable = false
)

|

| @XmlAnyElement | 将 JavaBeans 属性映射到 XML 信息集表示或 JAXB 元素。默认设置:

@XmlAnyElement (
    lax = false, 
    value = W3CDomHandler.class
)

|

| @XmlAttribute | 将一个 JavaBeans 属性映射到 XML 属性。默认设置:

@XmlAttribute (
    name = ##default, 
    required = false, 
    namespace = "##default" 
)

|

@XmlAnyAttribute 将 JavaBeans 属性映射到通配符属性映射。默认设置:无
@XmlTransient 防止将 JavaBeans 属性映射到 XML 表示。默认设置:无
@XmlValue 定义类到 XML Schema 复杂类型或 XML Schema 简单类型的映射。默认设置:无
@XmlID 将 JavaBeans 属性映射到 XML ID。默认设置:无
@XmlIDREF 将 JavaBeans 属性映射到 XML IDREF。默认设置:无
@XmlList 将属性映射到简单类型列表。默认设置:无
@XmlMixed 标记 JavaBeans 多值属性以支持混合内容。默认设置:无
@XmlMimeType 关联控制属性的 XML 表示的 MIME 类型。默认设置:无
@XmlAttachmentRef 标记字段/属性,其 XML 表单是指向 mime 内容的 URI 引用。默认设置:无
@XmlInlineBinaryData 禁用对绑定到 XML 中 base64 编码二进制数据的数据类型考虑 XOP 编码。默认设置:无

以下表总结了可以与对象工厂一起使用的 JAXB 注解。

表格:与对象工厂相关的 JAXB 注解

注解 描述和默认设置

| @XmlElementDecl | 将工厂方法映射到 XML 元素。默认设置:

@XmlElementDecl (
    scope = GLOBAL.class, 
    namespace = "##default", 
    substitutionHeadNamespace = "##default", 
    substitutionHeadName = ""
)

|

以下表总结了可以与适配器一起使用的 JAXB 注解。

表格:与适配器相关的 JAXB 注解

注解 描述和默认设置

| @XmlJavaTypeAdapter | 使用实现 @XmlAdapter 注解的适配器进行自定义编组。默认设置:

@XmlJavaTypeAdapter ( type = DEFAULT.class )

|

@XmlJavaTypeAdapters 用于在包级别定义多个 @XmlJavaTypeAdapter 注解的容器注解。默认设置:无


相关文章
|
24天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
3月前
|
Java 开发者 UED
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
56 3
|
2天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
2天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
2天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
11天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
25 2
|
18天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
|
21天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
本系列教程笔记详细讲解了Kotlin语法,适合希望深入了解Kotlin的开发者。对于需要快速学习Kotlin的小伙伴,推荐查看“简洁”系列教程。本篇笔记重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android库开发建议以及相互调用时的注意事项。
22 3
|
23天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
21 3
|
24天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)