使用JAXB的简介

我正在将一些依赖于Apache XMLBeans的模块迁移到JAXB。 这是令人兴奋且充满挑战的几天。 我想记下我遇到的一些重要事情,以供将来可能会发现有用的任何人使用。

首先,让我们来看一下设置用于JAXB代码生成的maven插件。 在撰写本文时,我遇到了两个Maven插件。

  • http://www.mojohaus.org/jaxb2-maven-plugin/Documentation/v2.2/index.html
  • https://github.com/highsource/maven-jaxb2-plugin

最后使用第一个,因为我发现配置非常简单。

您的Maven项目结构如下:

项目文件夹-> src-> main-> xsd

这将保存您要从中生成JAXB对象的所有XSD文件。

项目文件夹-> src-> main-> xjb

这将保留您的“ bindings.xml”文件,该文件是您的数据绑定文件,用于运行JAX生成任务(xjc)时需要进行的任何自定义。

maven的插件配置如下所示;

<plugin><groupId>org.codehaus.mojo</groupId><artifactId>jaxb2-maven-plugin</artifactId><version>2.2</version><executions><execution><id>xjc</id><goals><goal>xjc</goal></goals></execution></executions><configuration><target>2.1</target><sources><source>src/main/xsd</source></sources></configuration></plugin>
  • 与XMLBeans一起使用的一件事是所有可选元素的“ isSet”类型的方法,这些方法将检查是否设置了该元素。 默认情况下,JAXB不会生成此方法,因此您必须在每个元素上使用not null条件。 幸运的是,绑定配置允许以下操作:
<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:jxb="http://java.sun.com/xml/ns/jaxb"xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"jxb:extensionBindingPrefixes="xjc"version="2.1">
<jxb:globalBindings  generateIsSetMethod="true"
</jxb:globalBindings>
</jxb:bindings>
  • 默认情况下,JAXB不会为XSD文件上定义的枚举生成Java枚举。 可悲的是,我找不到在全球范围内应用这一代的方法,只能按XSD处理它。 但是对于XMLBeans,这是自动完成的。 为了生成Java枚举,应该执行以下操作:

样本XSD:

<xs:complexType name="EndpointType"><xs:attribute name="protocol"><xs:simpleType><xs:restriction base="xs:string"><xs:enumeration value="HTTP"/><xs:enumeration value="HTTPS"/><xs:enumeration value="PAYLOAD"/></xs:restriction></xs:simpleType></xs:attribute></xs:complexType>

JAXB绑定:

<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:jxb="http://java.sun.com/xml/ns/jaxb"xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"jxb:extensionBindingPrefixes="xjc"version="2.1">
<jxb:bindings schemaLocation="../xsd/testconfig.xsd"><jxb:bindings node="//xs:complexType[@name='EndpointType']/xs:attribute[@name='protocol']/xs:simpleType"><jxb:typesafeEnumClass name="Protocol" /></jxb:bindings></jxb:bindings>
</jxb:bindings>

schemaLocation –这是我要引用的XSD的相对路径。 由于我的“ bindings.xml”位于“ xjb”目录中,因此我不得不向上移动一步,进入XSD目录,以获取所需的XSD文件。

节点 –在这里,您需要提供定义了枚举的简单类型的xquery路径。 如果将其与提供的XSD进行交叉检查,您将了解XQuery路径如何检索给定元素。

注意 :无论如何,如果您的xpath返回多个具有相同名称的元素,您仍然可以通过在<jxb:bindings>元素上引入元素multiple =“ true”来处理此问题。

例如:<jxb:bindings node =” // xs:complexType [@ name ='EndpointType'] / xs:attribute [@ name ='protocol'] / xs:simpleType”
多个=“ true” >

typesafeEnumClass –在此元素上,您可以提供要生成的Java枚举名称。

  • 默认情况下,XMLBeans将所有XSD日期和日期时间元素转换为Java Calendar对象。 但是,对于JAXB,默认情况下使用XMLGregorianCalendar 。 全局绑定再次得以解决,并通过以下配置处理了该配置,该配置将所有XSD日期元素转换为Java Calendar对象。
<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:jxb="http://java.sun.com/xml/ns/jaxb"xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"jxb:extensionBindingPrefixes="xjc"version="2.1"><jxb:globalBindings><jxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"printMethod="javax.xml.bind.DatatypeConverter.printDateTime"/><jxb:javaType name="java.util.Calendar" xmlType="xs:date"parseMethod="javax.xml.bind.DatatypeConverter.parseDate"printMethod="javax.xml.bind.DatatypeConverter.printDate"/><jxb:javaType name="java.util.Calendar" xmlType="xs:time"parseMethod="javax.xml.bind.DatatypeConverter.parseTime"printMethod="javax.xml.bind.DatatypeConverter.printTime"/></jxb:globalBindings></jxb:bindings>
  • 如果需要使您的JAXB对象可序列化,则可以使用以下全局绑定配置来实现:
<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:jxb="http://java.sun.com/xml/ns/jaxb"xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"jxb:extensionBindingPrefixes="xjc"version="2.1"><jxb:globalBindings ><xjc:serializable /></jxb:globalBindings></jxb:bindings>

达到目的的元素是“ <xjc:serializable />”元素。

  • 在JDK 1.8中,我遇到了一个问题,即如果您的XSD中有一个导入了另一个架构以通过HTTP检索另一个XSD,则该问题被阻止了。 抛出错误的摘录是“因为由于accessExternalDTD属性设置的限制而不允许'http'访问” 。 在这种情况下,解决方法是使用以下maven插件设置绕过此限制所需的VM参数。 有关此问题的更多信息,请参见此处 。
<plugin><!-- We use this plugin to ensure that our usage of themaven-jaxb2-plugin is JDK 8 compatible in absence of a fixfor https://java.net/jira/browse/MAVEN_JAXB2_PLUGIN-80. --><groupId>org.codehaus.mojo</groupId><artifactId>properties-maven-plugin</artifactId><version>1.0.0</version><executions><execution><id>set-additional-system-properties</id><goals><goal>set-system-properties</goal></goals></execution></executions><configuration><properties><property><name>javax.xml.accessExternalSchema</name><value>file,http</value></property><property><name>javax.xml.accessExternalDTD</name><value>file,http</value></property></properties></configuration>
</plugin>

就是这样。 我会继续更新这篇文章。 与往常一样,您对此的反馈总是非常感激。

谢谢您的阅读,祝大家有美好的一天。

翻译自: https://www.javacodegeeks.com/2016/08/introduction-working-jaxb.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于opencv读取摄像头的未解之谜

前段时间做项目需要用opencv读usb摄像头的视频数据&#xff0c;遇到很多无解的问题&#xff0c;虽然后来没有用到&#xff0c;但是还是记录下来&#xff0c;也许以后就知道答案了呢。 1、无论摄像头的实际分辨率是多少&#xff0c;opencv读进来的视频分辨率都是640*480大小的&a…

[BZOJ2834]回家的路

Description Input Output Sample Input 2 1 1 2 1 1 2 2Sample Output 5思路还是很简单的&#xff0c;然而最短路打错各种对拍各种调了一早上代码&#xff1a;1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<vector>5 #includ…

dubbo优势_Dubbo与SpringCloud核心组件Ribbon、Hystrix、Feign的优劣势比较

在微服务架构中&#xff0c;分布式通信、分布式事务、分布式锁等问题是亟待解决的几个重要问题。Spring Cloud是一套完整的微服务解决方案&#xff0c;基于 Spring Boot 框架。确切的说&#xff0c;Spring Cloud是一个大容器(而不是一个框架)&#xff0c;它可以将通过集成一些好…

使用Java更新DynamoDB项

在上一篇文章中&#xff0c;我们继续使用Java将项目插入DynamoDB。 DynamoDB还支持更新项目。 我们将使用Login表获取更新示例。 发布更新时&#xff0c;必须指定要更新的项目的主键。 public void updateName(String email,String fullName) {Map<String,AttributeValue…

Python执行系统命令的方法 os.system(),os.popen(),commands

最近在做那个测试框架的时候发现 Python 的另一个获得系统执行命令的返回值和输出的类。 最开始的时候用 Python 学会了 os.system() 这个方法是很多比如 C&#xff0c;Perl 相似的。 os.system(cat /proc/cpuinfo) 但是这样是无法获得到输出和返回值的&#xff0c;继续 Goog…

opencv的两个错误

1、imwrite未定义标识符先检查opencv和C有没有配置好&#xff0c;再看有没有包含相应的头文件&#xff0c;最后发现是因为没有使用cv的命名空间&#xff0c;需要加上using namespase cv&#xff1b; 2、cvCvtColor的使用函数原型&#xff1a;cvCvtColor&#xff08;src&#xf…

BTC、BCH和BSV三者到底有什么区别?

比特币发展到今天已经有10个年头了&#xff0c;在这十年的发展中&#xff0c;比特币一共经历了两次重要的分裂&#xff0c;现在变成了三种货币&#xff0c;第一种是目前继承了比特币绝大多数遗产的BTC&#xff1b;第二种是BCH&#xff1b;第三种是BSV。那这三种货币到底有什么区…

ping 不通 华为三层交换机vlan_华为三层交换机如何让VLAN间不能互通配置精编版...

时可以利用hybrid属性定义分属于不同的vlan的端口之间的互访&#xff0c;这是access和trunk端口所不能实现的。在一台交换机上不允许trunk端口和hybrid端口同时存在。1.先创建业务需要的vlan[SwitchA]vlan 10[SwitchA]vlan 20[SwitchA]vlan 30[SwitchA]vlan 40[SwitchA]vlan 50…

python进程池:multiprocessing.pool

阅读目录 例1&#xff1a;使用进程池例2&#xff1a;使用进程池&#xff08;阻塞&#xff09;例3&#xff1a;使用进程池&#xff0c;并关注结果例4&#xff1a;使用多个进程池 在利用Python进行系统管理的时候&#xff0c;特别是同时操作多个文件目录&#xff0c;或者远程控制…

eclipse juno_放弃Eclipse Juno

eclipse juno在上一个博客中&#xff0c;我发布了有关Eclipse 4.2 Juno设置的信息。 在需要重新安装其他东西的情况下&#xff0c;为我提供了很多参考。 那时我没有谈论的是我与Juno共同遇到的问题。 我以为这是我自己的安装程序&#xff0c;很麻烦&#xff0c;但是此后并没有太…

C语言结构体数组的使用

1、结构体数组的优点结构体可以存储不同的数据类型&#xff0c;将他们互相联系起来。结构体数组可以连续存储多个结构体&#xff0c;和数组作用相似。比如想定义同一个最小外接矩形的四个坐标值&#xff0c;并给予这个矩形一个特征编号。当需要存储多个最小外接矩形的信息时&am…

arthas 查看哪个方法调用最耗时_Java开源诊断工具Arthas使用方法详解

一、前言1、热更新代码的场景(1)当线上服务器出现问题时&#xff0c;有些时候现有的手段不足以发现问题所在&#xff0c;可能需要追加打印日志或者增加一些调试代码&#xff0c;如果我们去改代码重新部署&#xff0c;会破坏问题现场&#xff0c;可以通过热部署的手段来增加调试…

Java 12 - Java StringBuffer和StringBuilder类

Java StringBuffer和StringBuilder类 当对字符串进行修改的时候&#xff0c;需要使用StringBuffer和StringBuilder类。 和String类不同的是&#xff0c;StringBuffer和StringBuilder类的对象能够被多次的修改&#xff0c;并且不产生新的未使用对象。 StringBuilder类在Java 5中…

将你的Vim 打造成轻巧强大的IDE

Vim和Emacs一个称为神之编辑器一个被称为编辑器之神&#xff0c;固然很是夸张&#xff0c;但也足以说明这两 款软件的优秀和在程序员界的地位。但是它们都已漫长的学习曲线让人望而生畏&#xff0c;阻止了大 多数人进入。作为一名几乎完全使用Vim写各种代码、文档的人&#xff…

NutchServer的安全层

我曾作为GSoC 2016项目在Apache Nutch的NutchServer的Security Layer上工作&#xff0c;并完成了它。 在此博客文章中&#xff0c;我将解释其工作原理和使用方法。 首先&#xff0c;建议您阅读以前有关GSoC 2016接受的帖子&#xff1a; http ://furkankamaci.com/gsoc-2016-acc…

借助opencv将unsigned char数组显示为图像

在用C或者C做图像处理程序时&#xff0c;经常需要把结果图显示出来看看效果&#xff0c;这时候可以借助opencv的Mat类型&#xff0c;如下&#xff1a;Mat gray1_mat(rect_height, rect_width, CV_8UC1, minsrc);//为了显示图片 先改为mat类型imshow("去雾图像显示", …

眼图观测实验报告_眼图观察测量实验

实验12眼图观察测量实验一、实验目的1.学会观察眼图及其分析方法&#xff0c;调整传输滤波器特性。二、实验仪器1.眼图观察电路(底板右下侧)2&#xff0e;时钟与基带数据发生模块&#xff0c;位号&#xff1a;G 3&#xff0e;噪声模块&#xff0c;位号E 4&#xff0e;100M双踪示…

C、C++申请指针内存的问题

关于指针的血和泪的教训 1、指针申请时一定要检查是否申请成功&#xff0c;当项目比较庞大时&#xff0c;内存有可能申请不成功导致程序中断&#xff0c;而这时候往往无从知道哪里出现了问题。如下&#xff1a;double* wid (double*)malloc((num1) *sizeof(double));//存储每个…

invalid use of null value

给mysql的数据表的一个字段插入数据,不成功, 然后在数据表设计中,把不是null勾选上,又提示 invalid use of null value 这种情况比较尴尬 只能删掉这一个字段,然后新建一个同样名字的字段,然后直接勾选不是null然后在保存就行了 转载于:https://www.cnblogs.com/jnhs/p/1008253…

android 13.0 Launcher3定制folder文件夹16宫格实现二

1. 概述 在13.0的系统产品rom定制化开发中,对于Launcher3的定制功能也是不少的,比如在Launcher3中添加默认文件夹,把默认的app添加的文件夹里面,其他的app 然后按顺序排序。在文件夹布局就是默认的16宫格布局,接下来分析下相关源码来实现功能 2.Launcher3定制化之修改添…