JAX-B: отсутствующие атрибуты XML на дочерних элементах - PullRequest
2 голосов
/ 04 февраля 2012

Редактировать: Первоначально я пропустил, что может быть важной деталью из моего вопроса - мои сервисные методы, которые возвращают объекты Java для маршалинга, возвращают тип интерфейса (Foo), а не реализацию классатип (FooImpl).

У меня есть простой класс Java с аннотациями JAX-B для нескольких элементов и атрибутов:

@XmlRootElement(name = "foo")
public class FooImpl {
    private String id;
    private String name;

    @XmlElement
    public String getName() {
            return name;
    }

    public void setName(final String name) {
            this.name = name;
    }

    @XmlAttribute
    public String getId() {
            return Id;
    }

    public void setId(final String id) {
            this.id = id;
    }
}

Редактирование: класс FooImpl имеет интерфейс с именем Foo:

public interface Foo {
    public String getName();
    public void setName(final String name);

    public String getId();
    public void setId(final String id);
}

Когда у меня есть сервисный метод, который возвращает Foo, я получаю то, что ожидаю:

<foo id="abc123">
  <name>bar</name>
</foo>

Но у меня также есть другой класс, который содержит List<Foo>, и когда он маршалируется,элементы XML для foo не содержат атрибута id !!

<foos>
    <foo>
      <name>bar1</name>
    </foo>
    <foo>
      <name>bar2</name>
    </foo>
</foos>

Класс, содержащий список, выглядит следующим образом:

@XmlRootElement(name = "foos")
public class Foos {

    private List<Foo> foos;

    @XmlElement(name = "foo")
    public List<Foo> getFoos() {
        return foos;
    }

    public void setFoos(List<Foo> foos) {
        this.foos = foos;
    }

}

Я использую MOXy в качестве моей реализации JAX-B, но я не думаю, что это имеет значение.

1 Ответ

4 голосов
/ 04 февраля 2012

Примечание: Я EclipseLink JAXB (MOXy) и член JAXB (JSR-222) экспертная группа.

Поскольку у вас есть свойство, тип которого является интерфейсом, вам необходимо указать тип реализации в аннотации @XmlElement:

@XmlElement(name = "foo", type=FooImpl.class)
public List<Foo> getFoos() {
   return foos;
}

Ниже приведен полный пример:

Foos

package forum9137171;

import java.util.List;  
import javax.xml.bind.annotation.*;

@XmlRootElement(name = "foos")
public class Foos {

    private List<Foo> foos;

    @XmlElement(name = "foo", type=FooImpl.class)
    public List<Foo> getFoos() {
        return foos;
    }

    public void setFoos(List<Foo> foos) {
        this.foos = foos;
    }

}

Foo

package forum9137171;

public interface Foo {
    public String getName();
    public void setName(final String name);

    public String getId();
    public void setId(final String id);
}

FoomImpl

package forum9137171;

import javax.xml.bind.annotation.*;

@XmlRootElement(name = "foo")
public class FooImpl implements Foo {
    private String id;
    private String name;

    @XmlElement
    public String getName() {
            return name;
    }

    public void setName(final String name) {
            this.name = name;
    }

    @XmlAttribute
    public String getId() {
            return id;
    }

    public void setId(final String id) {
            this.id = id;
    }
}

Демо

package forum9137171;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Foos.class);
        System.out.println(jc);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum9137171/input.xml");
        Foos foos = (Foos) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foos, System.out);
    }

}

Вход / выход

org.eclipse.persistence.jaxb.JAXBContext@16a786
<?xml version="1.0" encoding="UTF-8"?>
<foos>
   <foo id="abc123">
      <name>bar1</name>
   </foo>
   <foo id="def456">
      <name>bar2</name>
   </foo>
</foos>

Для получения дополнительной информации

...