XSD любого типа и JAXB

У меня есть определение xsd (из www.tmforum.org ossj common api v1.5)

<element name="primaryKey" nillable="false">
   <complexType mixed="false">                   
      <complexContent mixed="false">
         <extension base="anyType"/>                   
      </complexContent>
   </complexType>
</element>

и хотел бы создать xml следующим образом

<ossj-co-v1-5:primaryKey>mykey</ossj-co-v1-5:primaryKey>

Класс PrimaryKey, сгенерированный из xsd с использованием xjc, требует, чтобы элемент DOM был сохранен в списке (см. сгенерированный класс PrimaryKey внизу). «myKey» здесь — это TextNode, и, поскольку это не элемент DOM, его нельзя добавить в xjc сгенерировал класс PrimaryKey. Как мне поступить, чтобы получить требуемый результат?

Вот класс PrimaryKey, сгенерированный из xsd

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
    "any"
    })
public static class PrimaryKey {

    @XmlAnyElement
    protected List<Element> any;
    @XmlAnyAttribute
    private Map<QName, String> otherAttributes = new HashMap<QName, String>();

    public List<Element> getAny() {
        if (any == null) {
            any = new ArrayList<Element>();
        }
        return this.any;
    }


    public Map<QName, String> getOtherAttributes() {
        return otherAttributes;
    }

}

person Kiran Mohan    schedule 15.08.2010    source источник
comment
Какие типы значений свойств вам нужны для хранения любого свойства, и согласны ли вы с решениями, которые включают ручное изменение сгенерированной модели?   -  person bdoughan    schedule 16.08.2010
comment
Он должен просто содержать строковое значение. Я не хочу вручную изменять сгенерированные классы, поскольку они создаются во время компиляции. Расширение сгенерированных классов или использование привязок xjb должно быть в порядке. Но я ищу примеры.   -  person Kiran Mohan    schedule 17.08.2010


Ответы (2)


Для вашего сценария подойдут следующие объектные модели. Я попытаюсь найти подходящие настройки схемы для создания этих объектных моделей.

Вариант 1

Ваш код может выглядеть следующим образом. Это будет означать, что элемент «primaryKey» вызовет создание экземпляра объекта PrimaryKey с соответствующим текстовым содержимым, установленным для любого свойства.

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = {"any" }) 
public static class PrimaryKey { 

    @XmlValue
    protected String any; 

    @XmlAnyAttribute 
    private Map<QName, String> otherAttributes = new HashMap<QName, String>(); 

    public List<Element> getAny() { 
        if (any == null) { 
            any = new ArrayList<Element>(); 
        } 
        return this.any; 
    } 


    public Map<QName, String> getOtherAttributes() { 
        return otherAttributes; 
    } 

} 

Вариант 2

Если вы хотите, чтобы внешний объект имел свойство String, соответствующее primaryKey, вы можете сделать следующее:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Root {

    // @XmlElement is implied
    private String primaryKey;

}
person bdoughan    schedule 17.08.2010

Опция #1 getAny() не может вернуть строку, так как подпись возвращает список.

Вариант №2 действительно работает. Спасибо!

Вот как выглядит моя модификация кода OSSJ:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ManagedEntityKey", propOrder = {
    "applicationContext",
    "applicationDN",
    "type",
    "primaryKey"
})
public class ManagedEntityKey {
   @XmlElement(required = true)
   protected String primaryKey;
   //protected ManagedEntityKey.PrimaryKey primaryKey;

И, конечно же, следует изменить подпись сеттеров и геттеров.

person KPothula    schedule 26.09.2011
comment
Это в конечном итоге полностью сработало для вас? Однако я сталкиваюсь с той же проблемой, когда я делаю то же, что и вы - даже выполняя сеттеры и геттеры - теперь это ломает вещи - да, я могу получить значение тега первичного ключа, но атрибут типа теперь отсутствует - person JGlass; 26.10.2017