连云港网站建设价格,网页设计实例有代码,个人建网站的详细步骤,品牌网站建设968jaxb我知道你们中的很多人已经在想什么#xff0c;所以让我们摆脱这个问题#xff1a;“ JAXB#xff1f; 如XML#xff1f; 来吧#xff0c;所有很棒的孩子都在使用JSON。” 关于XML与JSON的辩论以及许多促成它的论据都得到了很好的记录。 我不会花很多时间在这里重新整… jaxb 我知道你们中的很多人已经在想什么所以让我们摆脱这个问题“ JAXB 如XML 来吧所有很棒的孩子都在使用JSON。” 关于XML与JSON的辩论以及许多促成它的论据都得到了很好的记录。 我不会花很多时间在这里重新整理它们。 我相信每种格式都有其用途但是即使您处在“从未使用过XML”的阵营中您仍然可能想继续阅读因为我讨论的观察结果和技术应同样适用于与Jackson进行JSON数据绑定或类似工具。 在第1部分中我描述了一个简单的使用模式该模式将JAXB的数据绑定功能与JPA配对。 当然两者之间的交互并不总是那么简单因此在第2部分中我将研究如何解决可能遇到的一些复杂问题。 问题 在我当前的项目中我们正在构建一套Java应用程序来管理制造过程中物料的转移。 我们决定“从外而内”构建以在任何给定的迭代之后促进面向用户的演示。 因此在第一个迭代中我们使用硬编码的虚拟数据构建了一些屏幕。 然后在每次后续迭代中我们都会在屏幕后面添加更多基础架构和逻辑。 为了使早期的演示更具交互性我们决定为中央应用程序创建一个“测试控制台”。 一个人在控制台上键入命令可以模拟系统“已实现网络”部分的行为。 借助Antlr 4之类的工具可以简化命令解析构建控制台的成本是适中的并且我们认为使用控制台进行测试和诊断具有长期价值。 我们已经达到了需要由另一个应用程序的数据来驱动系统行为的地步。 负责创建和维护此数据的“其他应用程序”尚未编写并且不会使用一段时间因此我们需要一种通过控制台加载示例数据的方法。 选件 本质上我们的任务是构建或利用数据加载器。 我们选择XML作为文件的可能格式然后浏览我们的团队通常会熟悉的工具列表。 DBUnit具有数据加载功能旨在设置可重复的测试条件。 它支持两种不同的XML模式“平面”和“完整”每种模式显然都是面向表的。 它还提供了替换变量因此我们可以构建模板文件并允许控制台输入设置最终值。 我对以这种方式使用单元测试工具有些保留但是在团队颤抖的箭中这可能是最合适的。 不管是好是坏我第一次尝试使用它都没有成功结果是我看的是DBUnit API的错误部分这让我开始思考。 我们已经有一种方法即Hibernate将数据推送到我们的数据库中。 因此当我用“如何从XML文档创建实体实例”这一问题来表述问题时JAXB显然是竞争者。 我很高兴发现Java附带了JAXB实现因此我开始尝试一下。 新人的观点 从未使用过JAXB所以我开始进行一些研究。 我发现的许多材料都涉及从XML模式生成Java类。 这不足为奇-这是该工具可以完成的大部分工作-但就我而言我想将数据绑定到现有的Hibernate映射域类。 这导致了一些令人惊讶的事情我发现一些最全面的教程似乎并没有预料到这种用法。 我认为这很好地说明了您对工具的初始假设可以影响您的想法和使用方式。 如果像几个在线资源一样首先将JAXB与DOM进行比较那么将编组操作的输出视为需要遍历和处理的文档树是很自然的也许会将相关数据复制到并行的层次结构中。域对象。 遍历和处理可能比使用DOM树更容易至少在概念上但是作为权衡您必须保持两个类的层次结构直这需要谨慎的命名约定。 毫无疑问用例恰恰是必要的但该工具不仅限于这种方法。 如果您相反地比较JAXB与Hibernate作为将数据从外部源加载到您的域对象中的一种方式那么自然会问“为什么我不能同时使用一组域对象” 您至少可以在某些时候稍加注意。 简单案例 在这些示例中我将直接使用JAXB API。 我们只需拨打几个简单的电话即可完成我们的任务因此这相当简单。 值得注意的是Spring确实也提供JAXB集成尤其是如果您在整个应用程序中都使用Spring则它提供的配置方法可能是更可取的。 假设您有一个EMPLOYEE表。 每个员工都有一个唯一的数字ID和名称。 如果将注释用于ORM映射数据则可能具有如下域类 Entity
Table(name”EMPLOYEE”)
public class Employee {IdColumn(name”EMPLOYEE_ID”)private Integer employeeId;Column(name”FIRST_NAME”)private String firstName;Column(name”LAST_NAME”)private String lastName;// … getters and setters …
}; 现在我们要让用户提供一个Employee.xml数据文件。 假设我们没有需要遵循的特定XML模式那么我们不妨看看JAXB对该类的默认处理是什么。 因此我们将从最小的步骤开始将“雇员”实例“封送”到XML文档中。 如果我们对结果文档的外观感到满意我们将交换解组代码 如果没有我们可以考虑自定义映射。 首先我们需要配置一个JAXBContext实例以与我们的域类一起使用。 JAXBContext jaxb JAXBContext.newInstance(Employee.class); 顺便说一句我们可以传入包含类的包的名称而不是将类对象传递给newInstance前提是每个包都包含一个jaxb.index文件该文件列出了要使用的类或ObjectFactory类以及用于创建域类和/或包装它们的JAXBElement的方法的方法。 如果您需要大量无关域类的XML映射则此方法可能更可取。 JAXBContext具有创建编组器创建表示对象的XML文档和解组器实例化对象并从XML文档中的数据初始化它们的方法。 我们可以像这样检查Employee类的默认映射 Employee employee new Employee();employee.setEmployeeId(37);employee.setFirstName(“Dave”);employee.setLastName(“Lister”);Marshaller marshaller jaxb.createMarshaller();marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(employee, System.out); 严格来说setProperty调用不是必需的但会使输出更易于理解。如果尝试运行此代码则会收到异常消息告诉我们尚未识别出根元素。 为了解决这个问题我们将XmlRootElement批注添加到Employee类中。 XmlRootElement
Entity
Table(name”EMPLOYEE”)
public class Employee {IdColumn(name”EMPLOYEE_ID”)private Integer employeeId;Column(name”FIRST_NAME”)private String firstName;Column(name”LAST_NAME”)private String lastName;// … getters and setters …
}; 默认情况下编组器将映射每个公共bean属性getter / setter对和每个公共字段。 因此如果我们的Employee类具有您期望的getter和setter则我们的输出应类似于以下内容 ?xml version”1.0” encoding”UTF-8” standalone”yes”?
employeeemployeeId37/employeeIdfirstNameDave/firstNamelastNameLister/lastName
/employee 请注意下面的元素将采用任意顺序。 在我的测试中这是按字母顺序排列的。在这种情况下效果很好但是如果没有我们可以使用XmlType注释强制执行该顺序。 默认情况下解组器将以任何顺序获取元素。 JAXB很高兴不了解JPA批注而Hibernate或您可能使用的任何JPA提供程序将不理会JAXB批注因此我们现在可以通过简单地要求JAXB从文件中解组数据来将XML文件中的数据加载到数据库中。将结果对象传递给JPA提供程序。 解组代码如下所示 JAXBContext jaxb JAXBContext.newInstance(Employee.class);
Unmarshaller unmarshaller jaxb.createUnmarshaller();
File xmlFile /* … */;
Employee employee unmarshaller.unmarshal(xmlFile); 默认情况下如果从XML中省略了表示bean属性之一的元素则不会设置该属性。 因此例如如果我们的JPA映射包括自动生成employeeId则employee元素仅需要包含firstName和lastName。 好… 从理论上讲就是这样。 如果您知道理论与实践之间的区别则要额外加分。几个注释和可能的十几行代码足以让您入门。 另外一个好处是您可以在一个带注释的.java文件中查看所有数据表示形式XML数据库和Java对象之间的关系。 不太好… 上面的例子很简单可以涵盖大量的基本用例。 但是大多数真实的数据模型包括一对多关系和组合键之类的东西它们会增加您可能会或可能不会看到的皱纹。 在第2部分计划于2014年8月25日中我将介绍我遇到的一些复杂问题并讨论解决每个复杂问题的合理简单选择。 翻译自: https://www.javacodegeeks.com/2014/07/jaxb-a-newcomers-perspective-part-1.htmljaxb