Я не знаю, является ли мое решение очень элегантным, но я считаю, что оно работает так, как вы этого требуете.
Рассмотрим класс 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 ; это должна быть самая важная часть).