java - 从 JAXB 迁移到 Castor 的简单方法?

标签 java android xml jaxb castor

我创建了一个库,其中包含大约 200 个使用 JAXB 从现有 XSD 生成的 Java 类,如下所示:

xjc -no-header -d schemas -b xsd/binding.xml xsd

唉,Android 不支持 JAXB,一般建议似乎是使用不同的库。 Castor 似乎是一个合适的替代方案,特别是因为它提供了 .xsd 到 Java 类的转换。然而,这样做似乎比在 Java 中更复杂,而且我不知道结果与 xjc 输出有多大不同。

我的用例是解码和读取解码数据(不需要更改数据或编码)。也就是说,有大量代码依赖于生成的 Java 类模式,因此 xjc 生成的类与其 Castor 对应类之间的任何差异都意味着大量重构。

是否有一个简单的方法可以说明如何在 Castor 中从 .xsd 生成 Java 类并获得尽可能接近 xjc 生成的结果?

最佳答案

以下方法与我得到的最接近,但仍需要一些重构:

将名为 castorbuilder.properties 的文件放置在类路径中,其中包含以下内容:

org.exolab.castor.builder.javaclassmapping=type
org.exolab.castor.builder.javaVersion=5.0
# Replace the following lines with your schema(s)
org.exolab.castor.builder.nspackages=\
   http://example.com/schema/foo=com.example.schema.foo,\
   http://example.org/schema/bar=org.example.schema.bar
org.exolab.castor.builder.primitivetowrapper=true

然后运行以下命令行:

java -cp "*" org.exolab.castor.builder.SourceGeneratorMain -i schema.xsd -types j2

在上面,将类路径替换为 Castor JAR 文件和 castorbuilder.properties 的路径,并将 schema.xsd 替换为 XSD 文件的路径。

当然,您可以通过 Ant 或 Maven 调用 Castor — 在这种情况下,请务必使用与上述命令行选项相应的等效项,并确保选择属性文件。

需要重构的差异:

  • 枚举类型现在位于其自己的 types 子包中
  • XML 枚举文字采用 camelCase 格式,现在变为 CAMELCASE 而不是 CAMEL_CASE
  • Castor 生成数组属性,其中 JAXB 具有 Collection 属性
  • 一些类名使用下划线作为前缀;显然 JAXB 放弃了这些,而 Castor 保留了它们
  • 日期字段现在是 Date 实例
  • 在一个实例中,属性的名称从 value 更改为 content

但是,Castor 中似乎存在一个错误,如 some of the generated classes invoke a non-existent constructor 。这阻止了我成功地尝试这一点;我只是将现有代码重构到没有语法和编译器错误的程度。

关于java - 从 JAXB 迁移到 Castor 的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58590761/

相关文章:

java - 像常量一样工作的变量的命名约定

java - React - 如何将我想要的组件拾取到另一个模块中

java - 更新元数据后发现不适用于 GridFS

android - 如何让 9-patch 图像只水平扩展?

xml - 有什么作用! XPath 3.0 中的意思是什么?

java - 以 XML 或 JSON 格式输出 Java 堆栈跟踪

java - 重命名文件在线程 "main"java.nio.file.FileSystemException : 中抛出异常

Android 评分栏超出对话框范围

android - Canvas /旋转/屏幕方向

android - 使用 LinearLayout 将按钮底部对齐