我创建了一个库,其中包含大约 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/