【问题标题】:Generating JAXB class from XSDs with similar attribute names从具有相似属性名称的 XSD 生成 JAXB 类
【发布时间】:2012-01-27 21:34:53
【问题描述】:

我使用 maven-jaxb2-plugin 从 xsd 生成带有 jaxb 注释的类。我有很多这样的 xsd 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="A3">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="loginPartner">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="login"/>
              <xs:element type="xs:string" name="password"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="A3">
    <xs:complexType>
      <xs:sequence>
        <xs:element type="xs:string" name="errorCode"/>
        <xs:element type="xs:string" name="errorDescription"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

当我运行 maven 插件时,它给了我一个错误:

[错误] 解析架构时出错。位置 [ 文件:schema1.xsd{10,16}]。 org.xml.sax.SAXParseException: 'A3' 已经存在 定义

有没有办法解决这个问题? 实际上,我有许多 XSD 代表发往/来自服务器的请求/响应消息。我想简化创建、验证、解析消息。也许还有其他解决方案?

【问题讨论】:

  • 你能从你的pom.xml 发布你的插件配置吗?我现在找不到(到达)maven-jaxb2-plugin 的文档,而且我不知道所有选项。如果可行,请尝试将targetNamespace="http://whatever" 属性添加到您的架构中以区分具有相同名称的类型。可以将每个模式文件编译到不同的 Java 包中。那也可以。为此,您可能必须为插件指定 multipe executions

标签: java xml xsd jaxb2 maven-jaxb2-plugin


【解决方案1】:

在同一个命名空间中不能有冲突的元素定义。这与在 Java 中的给定包中不允许多个具有相同名称的类相同。最好的办法是使用不同的名称或在不同的命名空间中定义它们。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题;我有两个独立的 WSDL(每个都有几个模式定义),我通过 JAXB(通过 maven-jaxb2-plugin)运行以生成映射类。

    我的 WSDL 共享了导致 XJC 阻塞的重复架构定义。

    因为它们都是独立的,所以我能够通过运行 maven-jaxb2-plugin 的两个单独执行来生成 JAXB 映射 - 每个 WSDL 一个(在此处介绍 - How can I tell jaxb / Maven to generate multiple schema packages?)。

    【讨论】:

      【解决方案3】:

      您可以在 jaxb 绑定文件中重命名 xsd 的第二个或第一个 A3

      <jaxb:bindings schemaLocation="filePath.xsd" node="/xs:schema">
              <jaxb:bindings node="//xs:element[@name='A3']">
                  <jaxb:property name="SecondA3"/>
              </jaxb:bindings>
      </jaxb:bindings>
      

      【讨论】:

        猜你喜欢
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-16
        • 2013-10-17
        • 1970-01-01
        相关资源
        最近更新 更多