CXF — Wsdl2java — свойство XX уже определено

Я использую CXF для создания клиентского класса для доступа к серверу веб-службы. Веб-сервис основан на WCF (.NET).

Когда я вызываю wsdl2java, у меня возникает следующая ошибка:

The id property is already defined. use <jaxb:property> to resolve this conflict. The following location matches the above error : http://*****/WcfDemandService.svc?xsd=xsd2 [0,0]

Эта ошибка не появляется, если я запрашиваю привязку данных xmlbeans (используйте опцию «db xmlbeans»).

Есть ли способ генерировать классы с привязкой данных JAXB?


person clement M.    schedule 23.05.2013    source источник


Ответы (1)


Этот тип проблемы часто возникает, когда тип имеет атрибут и элемент с одинаковыми именами.

схема.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified">

    <element name="foo">
        <complexType>
            <sequence>
                <element name="bar" type="string"/>
            </sequence>
            <attribute name="bar" type="string"/>
        </complexType>
    </element>

</schema>

схема xjc.xsd

Когда мы пытаемся сгенерировать модель Java из этой XML-схемы, мы получаем следующую ошибку.

parsing a schema...
[ERROR] Property "Bar" is already defined. Use &lt;jaxb:property> to resolve this conflict.
  line 11 of file:/Users/bdoughan/Scratch/src/forum16714465/schema.xsd

[ERROR] The following location is relevant to the above error
  line 13 of file:/Users/bdoughan/Scratch/src/forum16714465/schema.xsd

binding.xml

Файл привязки JAXB можно использовать для настройки создаваемых классов. Здесь мы будем использовать его для переименования свойства, которое будет соответствовать атрибуту bar.

<jxb:bindings 
    xmlns:xs="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="//xs:element[@name='foo']/xs:complexType/xs:attribute[@name='bar']">
                <jxb:property name="barAttribute"/>
            </jxb:bindings>
    </jxb:bindings>

</jxb:bindings>

xjc -b binding.xml schema.xsd

Теперь, когда вы создаете классы Java, вы получите класс вроде:

package org.example.schema;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "bar"
})
@XmlRootElement(name = "foo")
public class Foo {

    @XmlElement(required = true)
    protected String bar;
    @XmlAttribute(name = "bar")
    protected String barAttribute;

    public String getBar() {
        return bar;
    }

    public void setBar(String value) {
        this.bar = value;
    }

    public String getBarAttribute() {
        return barAttribute;
    }

    public void setBarAttribute(String value) {
        this.barAttribute = value;
    }

}
person bdoughan    schedule 24.05.2013
comment
Можете ли вы помочь найти решение для генерации источников Java из wsdl не удается сгенерировать исходный код Java? у него похожая площадь... - person catch23; 17.09.2014
comment
Это отличный ответ - person Andremoniy; 27.05.2015