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

情到浓时终转凉″ 提交于 2019-11-28 01:19:13

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;
    }

}

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

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...

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!