Как мне написать объекты, которые я не могу контролировать в jaxb? - PullRequest
1 голос
/ 27 февраля 2012

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

@XmlRootElement(name="bar")
class Bar {
  @XmlAttribute
  private Foo foo;

  @XmlAttribute
  private String baz;
}

, что должно привести к xml-файлу, подобному этому:

<bar baz="stuff" foo="otherstuff"/>

Возможно ли это? Я пытался возиться с @XmlJavaTypeAdapter без успеха.

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Вы на правильном пути с XmlJavaTypeAdapter, но я подозреваю, что foo должен быть XmlElement, а не XmlAttribute:

@XmlRootElement(name="bar")
public class Bar {

  @XmlElement
  @XmlJavaTypeAdapter(FooAdapter.class)
  private Foo foo;

  @XmlAttribute
  private String baz;

}

FooAdapter может быть простым, как показано ниже, но выводкрасивее, если вы создаете прокси-объект для представления Foo и маршала, а не Object [].

class FooAdapter extends XmlAdapter<Object[], Foo> {

    @Override
    public Object[] marshal(Foo v) throws Exception {
        return new Object[]{ v.x, v.y, v.z };
    }

    @Override
    public Foo unmarshal(Object[] v) throws Exception {
        Foo foo = new Foo();
        foo.x = (String) v[0];
        foo.y = (Integer) v[1];
        foo.z = (Double) v[2];
        return foo;
    }

}
1 голос
/ 27 февраля 2012

Если у вас нет доступа к классам, используемым для генерации XML-файла, но у вас есть доступ к схеме, основанной на / используемой для генерации этих классов, вы должны быть в состоянии заново сгенерировать эти классы, используя xjc и файл определения схемы (xsd).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...