【问题标题】:JAXB Compiling Issue - [ERROR] Property "Any" is already definedJAXB 编译问题 - [错误] 属性“任何”已定义
【发布时间】:2012-11-28 16:49:21
【问题描述】:

我正在尝试为 xccdf-1.1.4.xsd 创建 JAXB 绑定,这是可以从 XCCDF Schema Location 获得的标准模式

我目前使用 EclipseLink MOXy 作为我的 JAXB 实现,因为我喜欢它还可以生成 JSON 绑定的事实。

我修复了几个使用外部绑定 XML 遇到臭名昭著的“[ERROR] 属性“值”已定义”错误的情况,现在我遇到了一个错误

[ERROR] Property "Any" is already defined. Use <jaxb:property> to resolve this conflict.
line 441 of file:/home/dchu/Playground/Java/eclipselink_moxy/xccdf_1.1.4/xccdf-1.1.4.xsd

[ERROR] The following location is relevant to the above error
line 444 of file:/home/dchu/Playground/Java/eclipselink_moxy/xccdf_1.1.4/xccdf-1.1.4.xs

下面是 XML 模式中发生错误的行的 sn-p。

<xsd:sequence>
    <xsd:choice minOccurs="1" maxOccurs="1">
      <xsd:any namespace="http://purl.org/dc/elements/1.1/"
               minOccurs="1" maxOccurs="unbounded"/>
      <xsd:any namespace="http://checklists.nist.gov/sccf/0.1"
               processContents="skip" 
               minOccurs="1" maxOccurs="unbounded"/>
    </xsd:choice>
</xsd:sequence>

有谁知道这里可能出了什么问题?谢谢!

【问题讨论】:

    标签: jaxb eclipselink moxy


    【解决方案1】:

    您可以使用外部绑定文件来重命名任意属性之一。

    binding.xml

    <jxb:bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1">
    
        <jxb:bindings schemaLocation="schema.xsd">
            <jxb:bindings
                node="//xsd:complexType[@name='foo']/xsd:sequence/xsd:choice/xsd:any[@namespace='http://checklists.nist.gov/sccf/0.1']">
                <jxb:property name="any2" />
            </jxb:bindings>
        </jxb:bindings>
    
    </jxb:bindings>
    

    XML 架构 (schema.xsd)

    以下是您的 XML 架构的简化版本:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.example.org/schema" 
        xmlns="http://www.example.org/schema"
        elementFormDefault="qualified">
    
        <xsd:complexType name="foo">
            <xsd:sequence>
                <xsd:choice minOccurs="1" maxOccurs="1">
                    <xsd:any namespace=""
                        minOccurs="1" maxOccurs="unbounded" />
                    <xsd:any namespace="http://checklists.nist.gov/sccf/0.1"
                        processContents="skip" minOccurs="1" maxOccurs="unbounded" />
                </xsd:choice>
            </xsd:sequence>
        </xsd:complexType>
    
    </xsd:schema>
    

    XJC 通话

    以下是如何利用外部绑定文件进行 XJC 调用。

    xjc -b binding.xml schema.xsd
    

    生成的类(Foo)

    package org.example.schema;
    
    import java.util.*;
    import javax.xml.bind.annotation.*;
    import org.w3c.dom.Element;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "foo", propOrder = {
        "any",
        "any2"
    })
    public class Foo {
    
        @XmlAnyElement(lax = true)
        protected List<Object> any;
        @XmlAnyElement
        protected List<Element> any2;
    
    
        public List<Object> getAny() {
            if (any == null) {
                any = new ArrayList<Object>();
            }
            return this.any;
        }
    
        public List<Element> getAny2() {
            if (any2 == null) {
                any2 = new ArrayList<Element>();
            }
            return this.any2;
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      在使用 JAVA JAXB 实现生成 JAXB 绑定时,使用 Blaise 的建议创建 JAXB 外部绑定 XML 将起作用。

      但是在使用 EclipseLink MOXy jaxb-compiler.sh 时它不起作用。 Blaise 说这可能是编译器脚本中的一个错误。 bug ticket 395328

      目前解决此问题的方法是使用 JDK 中的 JAVA XJC 命令并在生成的目录中手动添加 jaxb.properties 文件。 Specifying-eclipselink-moxy-as-yours

      【讨论】:

        【解决方案3】:

        我在使用 Eclipse 时尝试了所有这些解决方案,但它们确实对我没有帮助。所以我切换到 Netbeans,它确实给了我同样的错误,只是一个对话框显示或多或少相同的错误消息,但细节较少。

        这是甜蜜的部分,Netbeans 确实创建了客户端服务!是的,带有该错误消息。

        您可以按如下方式创建 Web 服务客户端:
        1.右键项目,
        2.新
        3. Web 服务客户端
        4. 选择 WSDL URL 并粘贴 URL
        5. 单击完成,然后它会创建有错误的客户端。

        所以我在我的项目中找到了生成的 WSDL 文件,在文件中搜索“any”的出现,并在文件中的同一标记中每隔一次出现注释。

        commented line number 216

        在对同一标记中的所有第二次出现进行注释后保存文件。右键单击 Web Service(首先展开 Web Services References),单击 Refresh。并且您的 Web Service Client 也可以很好地运行,只需拖放方法并使用您的参数调用它们!

        这对我有用...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-11
          • 2014-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多