JAXB Compiling Issue - [ERROR] Property “Any” is already defined

前端 未结 3 1741
旧时难觅i
旧时难觅i 2020-12-06 19:48

I am trying to create JAXB binding for xccdf-1.1.4.xsd which is a standard schema that can be obtain from XCCDF Schema Location

I am currently using EclipseLink MOXy

相关标签:
3条回答
  • 2020-12-06 20:38

    Using Blaise's suggestion to create a JAXB external binding XML would work when using the JAVA JAXB implementation to generate the JAXB binding.

    However it doesn't work when using EclipseLink MOXy jaxb-compiler.sh. Blaise said that it could be a possible bug in the compiler script. bug ticket 395328

    The workaround to this problem for now is to use the JAVA XJC command from the JDK and manually add the jaxb.properties file in the generated directory. Specifying-eclipselink-moxy-as-yours

    0 讨论(0)
  • 2020-12-06 20:44

    I tried all these solutions when I was using Eclipse and they really did not help me. SO I switched to Netbeans, which really gave me the same error with just a dialog box displaying more or less the same error message but with lesser detail.

    Here is the sweet part, Netbeans does create the client service! Yes, with that error message.

    You can just create your web service client as follows:
    1. Right click on the project,
    2. New
    3. Web Service Client
    4. Select the WSDL URL and paste the URL
    5. Click finish and then it creates the client with errors.

    So I located the generated WSDL file in my project, searched for occurrences of "any" in the file and commented every second occurrences in the file in the same tag.

    commented line number 216

    Save the file after commenting for all the second occurrences in the same tag. Right Click on the Web Service (first expand Web Services References), click Refresh. And your Web Service Client will be good to be run, just dragging and dropping methods and calling them with the your parameters!

    That worked for me...

    0 讨论(0)
  • 2020-12-06 20:52

    You can use an external bindings file to rename one of the any properties.

    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 (schema.xsd)

    Below is a simplified version of your XML schema:

    <?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 Call

    Below is how you make an XJC call that leverages an external binding file.

    xjc -b binding.xml schema.xsd
    

    Generated Class (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;
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题