Как сказать, что только определенные классы в XSD подключаются от предоставленного интерфейса? - PullRequest
1 голос
/ 03 ноября 2011

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

Мне нужно, чтобы более чем несколько сгенерированных классов наследовали от общего интерфейса, поскольку все они имеют метод .getName().

Вместо того, чтобы иметь огромный if(o instanceof XXX) для каждого из типов, блок, который я предпочел бы просто проверить на этот общий Interface, приведя к нему и вызвав .getName().

Вот мой интерфейс

package com.mycompany;

public interface Nameable
{
    public String getName();
}

, и вот что я добавляю в мой файл привязок .xjb

<jxb:bindings version="2.1"
          xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
          xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
          xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
          xmlns:inheritance="http://jaxb2-commons.dev.java.net/basic/inheritance"
          jxb:extensionBindingPrefixes="xjc inheritance"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"

...

<jxb:bindings node="//xsd:element[@name='container']">
  <inheritance:implements>com.mycompany.Nameable</inheritance:implements>
</jxb:bindings>

Он ничего не добавляет к сгенерированным классам.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "contents"
})
@XmlRootElement(name = "container")
public class Container implements Cloneable, CopyTo, Equals, HashCode, MergeFrom, ToString
{
   ...
}

Что такое магическое заклинание, чтобы этот интерфейс был добавлен в список?

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011
<jxb:bindings node="//xsd:element[@name='container']">
  <inheritance:implements>com.mycompany.Nameable</inheritance:implements>
</jxb:bindings>

должен был выглядеть как

<jxb:bindings node="//xsd:element[@name='container']">
  <jxb:class/>
  <inheritance:implements>com.mycompany.Nameable</inheritance:implements>
</jxb:bindings>

, как только я добавил недостающий раздел, он начал работать как положено

0 голосов
/ 02 декабря 2011

Я думаю, вам следует настроить сложный тип вашего элемента.Именно этот тип реализует ваш интерфейс, так что это правильное место для настройки / implements.

...