【问题标题】:Conversion headache转换头疼
【发布时间】:2013-07-25 04:53:41
【问题描述】:

我正在处理将 XML 节点转换为 JPA 实体的任务。 XML 中的对象与实体所表示的对象相似,但并不完全相同。看来我前面会有很多转换代码。

XML 在 Schema .xsd 文件中定义,我使用 JAXB 生成类并创建实例。上面的决定是不要触及生成的类型。我将为他们每个人创建转换器,也许我会使用访问者模式,还不知道。

让我烦恼的是有人决定更改 .xsd 文件并且不会更新负责的转换器。

我的想法是让这些转换器类维护一个静态的最终字段列表,这些字段来自适当的 JAXB 类,这些字段在代码中处理。如果有人在 .xsd 文件中更改它们,则会记录一些警告,指出某些字段尚未处理,或者某些已处理的字段不再存在。

此外,我想确保转换器的数量与 JAXB 生成的类的数量相匹配。 怎么做?

也许我应该以某种方式检查执行时间可以从 .xsd 文件生成哪些类,并将它们与注册的转换器进行比较。我觉得我不能只扫描特定包中的类来检查 JAXB 输出类。

也许访问者模式可以告诉我出了什么问题,但延长检查直到实际发生 XML-JPA 转换错误可能是个坏主意。

【问题讨论】:

  • 如果您在构建过程中生成类,那么如果有人更改了XSD文件并且对于未处理的字段,应该通知可以实现缺失的人字段。没有简单的解决方案。
  • 他们应该通知,但你永远不知道他们是否会......虽然,预防措施可能会花费我更多的时间而不是值得的。
  • 如果您希望您的 XSD 独立于您的目标 Java 类而发展,我建议不要使用 JAXB。相反,您可以让您的转换器使用 XPath 表达式从 XML 文件中众所周知的位置提取数据。如果架构更改,某些路径可能不再有效,但 XPath 不会崩溃,您可以记录一些警告消息。
  • 只要你正确生成JAXB类,它就会产生编译时错误,对于其他人你应该编写测试用例或某种进行验证的代码
  • xsd 和实体类已给出,我对它们没有权力。我只能翻译,而且必须是“手动”翻译。

标签: java xml jpa jaxb schema


【解决方案1】:

如果我做对了,您希望实体也使用 JAXB 注释、xsd 文件进行注释并创建映射器 xml 实体,对吗?还是xml和实体之间有一些DTO?

我认为您可以尝试在构建期间从 Java 类创建 xsd 文件。 然后 xml -> Java 类转换,您可以使用 JAXB 编组器进行。 如果您仍然需要知道转换的数量是否与 Java 类的数量相匹配,那么我会为此创建集成测试。例如,我需要保留一些命名约定: 我的实体,我的实体映射器 然后测试将通过实体(dtos?)并搜索映射器。

但也许我没有正确理解您的问题,请提供更多详细信息。

【讨论】:

  • 无法将 xml 定向到实体。未生成 xsd。
  • 多亏了这一点,您可以保持实体不受 JAXB 注释的影响。所以我想我会为 xml DTO 使用 JAXB 编组器,并为 DTO 实体创建映射器。仍然进行集成测试以确保映射器存在。你怎么看?
  • 是的,我想进行测试,但我需要以某种方式确定已处理类的完整列表。它们是在构建期间生成的。我想我需要更深入地了解 JAXB,才能自己从 .xsd 文件中获取该列表。
  • 好吧,我认为您可以访问生成的类并将它们与映射器进行比较。
  • 你的意思是把它们当作文件访问?没想到,也许是个解决办法。
猜你喜欢
  • 2013-03-01
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
相关资源
最近更新 更多