`
zzc1684
  • 浏览: 1222814 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

JAXB学习三 (验证)

    博客分类:
  • JAXB
阅读更多

一个完整个对象-模型映射,一定少不了对验证的支持。

 

jaxb当然也支持验证,分为两个部分:marshall和unmarshall。

 

一、unmarshall端

unmarshall是从xml到java对象的过程,因此验证的是这个xml文件是不是有效的,要在unmarshall端使用验证非常简单:

Java代码 复制代码 收藏代码
  1. Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();   
  2. unmarshaller.setSchema(SchemaFactory.newInstance(   
  3.         XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(   
  4.         new File("students.xsd")));   

从jaxb2.0开始,通过调用方法setSchema()的方式来指定验证,在2.0以前的版本里,通过调用setValidating()方法来指定验证:

Java代码 复制代码 收藏代码
  1. unmarshaller.setValidating(true)   

验证信息可以是一个schema文件,也可以是一个dtd文件(如果支持的话),要使用dtd的验证,则代码大致为:

Java代码 复制代码 收藏代码
  1. Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();   
  2. unmarshaller.setSchema(SchemaFactory.newInstance(   
  3.         XMLConstants.RELAXNG_NS_URI).newSchema(   
  4.         new File("students.dtd")));  

一旦设置了验证信息,在进行unmarshell的时候,jaxb就会对读入的xml文件进行验证,例如有schema文件:

 

Xml代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.liulutu.com/students/"  
  3.     targetNamespace="http://www.liulutu.com/students/">  
  4.     <element name="students">  
  5.         <complexType>  
  6.             <sequence>  
  7.                 <element name="student" type="tns:StudentType" maxOccurs="unbounded" />  
  8.             </sequence>  
  9.         </complexType>  
  10.     </element>  
  11.     <simpleType name="SexType">  
  12.         <restriction base="string">  
  13.             <enumeration value="Male"></enumeration>  
  14.             <enumeration value="Female"></enumeration>  
  15.         </restriction>  
  16.     </simpleType>  
  17.   
  18.     <complexType name="StudentType">  
  19.         <attribute name="sex" type="tns:SexType"></attribute>  
  20.         <attribute name="name" type="string"></attribute>  
  21.     </complexType>  
  22. </schema>   

和符合这个schema的一个xml文件:

Java代码 复制代码 收藏代码
  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>   
  2. <ns2:students xmlns:ns2="http://www.liulutu.com/students/">   
  3. </ns2:students>   

如果指定了需要验证,当根据上面的schema读入些xml时,就会抛出一个验证失败异常:

Java代码 复制代码 收藏代码
  1. [org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content of element 'ns2:students' is not complete. One of '{student}' is expected.]   
  2.     at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(Unknown Source)   
  3.     at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(Unknown Source)   
  4.     at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(Unknown Source)   
  5.     at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(Unknown Source)   
  6.     at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)   
  7.     at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)   
  8.     at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)   
  9.     at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(Unknown Source)  

注:需要在unmarshall.unmarshall()方法调用之前设置验证信息。

二、marshall端

jaxb2.0中,marshall和unmarshall的验证设置是一样的:

Java代码 复制代码 收藏代码
  1. ObjectFactory factory = new ObjectFactory();   
  2. Students students = factory.createStudents();   
  3. Marshaller marshaller = jaxbContext.createMarshaller();   
  4. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);   
  5. marshaller.setSchema(SchemaFactory.newInstance(   
  6.         XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(   
  7.         new File("students.xsd")));   
  8. marshaller.marshal(students, new File("a.xml"));   

和上面一样,会得到一个异常信息:

Java代码 复制代码 收藏代码
  1. [org.xml.sax.SAXParseException: cvc-complex-type.2.4.b: The content of element 'ns2:students' is not complete. One of '{student}' is expected.]   
  2.     at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(Unknown Source)   
  3.     at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(Unknown Source)   
  4.     at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(Unknown Source)   

如果使用jaxb2.0之前的版本,则验证方式如下:

Java代码 复制代码 收藏代码
  1. Validator validator = jaxbContext.createValidator();   
  2. validator.validate(students);  
分享到:
评论

相关推荐

    JAXB.zip_jaxb

    通过分析这个"JAXB.zip_jaxb"压缩包的内容,我们可以学习到如何在NetBeans中创建和管理一个JAXB项目,理解JAXB的基本原理和用法,以及如何利用Ant进行构建和测试。这不仅有助于加深对JAXB的理解,也能够提升在实际...

    jaxb功能用法

    通过这个项目,你可以学习如何在实际应用中使用JAXB进行XML数据的处理,并确保数据的有效性和一致性。 总结,JAXB是Java平台上强大的XML处理工具,它通过将XML与Java Bean之间建立映射,简化了数据交换。结合XSD...

    jaxb入门学习

    ### Jaxb入门学习知识点详解 #### 一、JAXB概念与作用 JAXB (Java Architecture for XML Binding) 是一种将XML数据与Java对象互相转换的技术。它通过编组(marshalling)和解组(unmarshalling)的过程,使得开发者...

    java jdk1.6 新特性 jaxb2 demo

    Java JDK 1.6是Java开发工具包的一个重要版本,发布于2006年,引入了许多增强功能和新特性,极大地提升了开发效率...通过这样的示例,学习者可以深入理解JAXB的工作原理,以及它如何简化Java程序与XML数据交互的过程。

    axis部署WebServices 和 JAXB的使用

    5. **测试服务**: 使用Axis自带的`testClient`或自定义客户端调用服务,验证部署是否成功。 接下来,我们来看JAXB的角色。JAXB允许你通过注解将Java类映射为XML Schema,反之亦然。在Web服务中,JAXB通常用于处理...

    jaxb资料及实例,里面还包含了其他资料地址3

    4. **XML Schema支持**:JAXB支持XML Schema,这意味着开发者可以基于XML Schema来验证XML文档,确保数据的正确性。 5. **集成性**:JAXB可以与其他Java技术如JAX-WS(Java API for XML Web Services)无缝集成,...

    jaxb-istack-commons

    `jaxb-istack-commons` 就是在JAXB基础上进行扩展和增强的工具集,它提供了许多实用工具类和方法,帮助开发者更轻松地处理与XML相关的操作,比如XML的序列化和反序列化,以及XML数据的验证等。 关于许可,`jaxb-...

    纯Java(swing)写的xsd验证xml - 含

    标题中的“纯Java(swing)写的xsd验证xml”是指使用Java编程语言,结合Swing图形用户界面库,开发的一个工具,用于...此外,你还可以学习如何将XML解析库(如JAXB或DOM)与自定义逻辑结合,以实现XML文档的验证功能。

    jaxb-example

    教程通常包括逐步指南,演示如何创建基本的JAXB绑定,如何生成Java类,如何使用Unmarshaller和Marshaller,以及如何处理XML验证和错误。这些教程对于初学者尤其有用,帮助他们快速上手并掌握JAXB的基本操作。 "jaxb...

    jaxb-examples

    5. **数据绑定API的使用**:JAXB提供了诸如`Marshaller`、`Unmarshaller`、`Binder`和`ValidationEventHandler`等接口,示例中会展示如何利用这些API进行XML数据的序列化和反序列化,并处理可能出现的错误和验证问题...

    JaxbGen.rar

    如果你正在学习或使用JAXB处理XML,这篇博客可能会提供一些实用的指导。 总的来说,这个压缩包提供了一个使用Java JAXB处理XSD-10的示例项目,涵盖了从XSD到Java对象的映射,以及可能的反向转换,是理解JAXB工作...

    suunto-sml-model:JAXB SML模型

    8. **自定义逻辑**:虽然JAXB提供了自动化转换,但有时仍需编写自定义逻辑来处理特殊需求,例如数据验证、转换或计算。 了解以上知识点后,开发者可以有效地利用Suunto SML模型与JAXB技术,构建与Suunto设备兼容的...

    Java and XML(英文第三版)_java_xml_birdsolc_源码

    通过学习本书,读者可以掌握Java与XML的集成技巧,理解如何利用Java API处理XML文档,以及如何构建和消费Web服务。对于Java开发者来说,XML技术是必备的技能之一,这本手册将帮助他们提升在这个领域的能力。

    最新XML学习进阶课件

    - 类到XML:学习如何使用JAXB注解将Java类映射为XML文档。 - XML到类:掌握如何从XML文档反向生成Java对象。 通过这九个章节的学习,可以全面了解XML的核心概念和技术,并掌握如何在实际项目中运用这些知识,实现...

    对xml进行解析;进行增删改查还有schema验证

    三、XML Schema验证 XML Schema定义了XML文档的结构和数据类型,确保文档符合预定规范。使用XML Schema验证,可以避免因数据格式错误导致的问题。在Java中,可以使用`javax.xml.validation`包提供的API进行验证,...

    CamelJAXBExample:骆驼和 JAXB 的简单例子

    通过阅读和理解这些文件,你可以学习如何在实际项目中结合 Camel 和 JAXB 来处理 XML 数据。 总结来说,"CamelJAXBExample" 是一个展示如何在 Apache Camel 中利用 JAXB 处理 XML 数据的示例。这个例子将帮助开发者...

    Java and XML(英文第三版)

    这些基础知识是理解XML数据结构和验证机制的关键,对于任何想要处理XML的Java开发者来说,都是不可或缺的。 接着,书中的章节会深入讲解Java API for XML Processing (JAXP),这是Java平台用于解析和生成XML的官方...

    学习JAVA的30个目标.doc

    7. **Servlets、JSP与Web框架**:掌握Servlet和JSP的生命周期,学习JSTL和其他第三方标签库。熟悉主流的Web框架,如JSF、Struts、Tapestry、Cocoon和WebWork,理解MVC模式。 8. **Web服务器与部署**:学习如何配置...

    XML 轻松学习手册(完整版)

    - **开发框架**: 如Java中的JAXB(Java Architecture for XML Binding)等工具可以帮助开发者更方便地处理XML数据。 #### 四、XML的实例分析 **4.1 示例文档分析** - **结构**: 分析XML示例文档的结构,理解各...

    java的28个学习目标

    深入学习Java安全模型,包括类加载器安全、字节码验证、安全管理器、策略和权限、代码签名、数字签名、加密学基础、认证机制(如Kerberos)。熟悉各种安全/认证API,如JAAS(Java Authentication and Authorization ...

Global site tag (gtag.js) - Google Analytics