JAXB: установка complexTypes для использования существующих классов Java - PullRequest
3 голосов
/ 05 сентября 2010

В настоящее время JAXB создает класс точек из указанной мной XML-схемы. Однако я бы предпочел использовать существующий класс java.awt.Point. И для любых других типов, которые я определил, использовать и импортировать java.awt.Point.

Вот мой код:

<xs:complexType name="point">
  <xs:sequence>
    <xs:element name="x" type="xs:int" />
    <xs:element name="y" type="xs:int" />
  </xs:sequence>
</xs:complexType>

Возможно ли это?

1 Ответ

3 голосов
/ 05 сентября 2010

Я не знаю, является ли мое решение очень элегантным, но я считаю, что оно работает так, как вы этого требуете.

Рассмотрим класс Test со свойством p типа java.awt.Point:

@XmlRootElement
public class Test {
    @XmlElement
    @XmlJavaTypeAdapter(PointAdapter.class)
    public Point p;
}

Класс PointAdapter выглядит следующим образом:

class PointAdapter extends XmlAdapter<String, Point> {

    @Override
    public String marshal(Point v) throws Exception {
        return String.format("%d;%d", v.x, v.y);
    }

    @Override
    public Point unmarshal(String v) throws Exception {
        String[] coords = v.split(";");
        return new Point(Integer.parseInt(coords[0]), Integer.parseInt(coords[1]));
    }

}

Если вы не создаете свои классы Java вручную, но позволяете им генерировать xjc, есть возможность указать XmlAdapter в схеме; либо через отдельный файл привязки, который вы можете указать с помощью опции -b xjc, либо встроенный в ваш XSD. Лично я предпочитаю первое решение, поскольку оно сохраняет схему в чистоте. Прошло много времени с тех пор, как я поиграл с этим, я отсылаю вас к документации JAXB (ищите MyDatatypeConverter ; это должна быть самая важная часть).

...