gpt4 book ai didi

java - 当两个单独的模式具有相同的命名空间时,如何告诉 JAXB 在单独的包中生成类?

转载 作者:行者123 更新时间:2023-12-02 03:27:42 24 4
gpt4 key购买 nike

我怀疑这个问题没有好的答案,但希望我遗漏了一些东西。假设我有两个独立的 XML 模式,它们都具有相同的命名空间,定义了一些重复的复杂类型,并且我想使用 JAXB 为它们生成 Java 类。作为一个非常简单的示例:

schema1.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" targetNamespace="namespace1" xmlns="namespace1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="foo" type="xs:string"/>
</xs:schema>

schema2.xsd:(与上面相同)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema elementFormDefault="qualified" targetNamespace="namespace1" xmlns="namespace1" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="foo" type="xs:string"/>
</xs:schema>

当我尝试使用 JAXB(通过 gradle 的 Ant XJC 任务)生成这些内容时,我收到以下完全合理的错误:

[ant:xjc] [ERROR] 'foo' is already defined
[ant:xjc] line 3 of file:/C:/dev/test/src/main/resources/schema2.xsd
[ant:xjc]
[ant:xjc] [ERROR] (related to above error) the first definition appears here
[ant:xjc] line 3 of file:/C:/dev/test/src/main/resources/schema1.xsd

根据 JAXB docs ,我尝试在外部自定义文件中指定包,如下所示:

<jaxb:bindings schemaLocation="schema1.xsd">
<jaxb:schemaBindings>
<jaxb:package name="package1"/>
</jaxb:schemaBindings>
</jaxb:bindings>
<jaxb:bindings schemaLocation="schema2.xsd">
<jaxb:schemaBindings>
<jaxb:package name="package2"/>
</jaxb:schemaBindings>
</jaxb:bindings>

但这不起作用 - 然后我意识到上面链接的相同文档说:

Note that this customization is per namespace. That is, even if your schema is split into multiple schema documents, you cannot put them into different packages if they are all in the same namespace.

所以,我猜这永远不会起作用。

有什么明智的方法吗?我怀疑正确的答案是模式应该位于不同的命名空间中,因为这可以解决问题,并且可能更具逻辑意义,但我对模式没有任何控制权 - 它们是由第三方提供的。我问过是否可以更改它们,但我怀疑答案是否定的。

我能看到的唯一其他选项是生成 Java 类两次,第一次为 schema1.xsd,然后单独为 schema2.xsd,每次都使用自己的自定义文件指定不同的包,但这感觉就像一个非常笨拙的解决方案。我还缺少更明智的选择吗?

最佳答案

你不能。包是根据命名空间生成的。相同的命名空间 - 相同的包。

在这种情况下,您必须执行多次。还要注意使用不同的输出生成目录(例如 target/generated-sources/xjc1target/generated-sources/xjc2),否则“仅在发生任何更改时才编译”无法正常工作。

关于java - 当两个单独的模式具有相同的命名空间时,如何告诉 JAXB 在单独的包中生成类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38592855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com