#java #jaxb #moxy
Вопрос:
Я пытаюсь создать адаптер для маршалирования Point2D, используя вариант адаптера точки, указанный на сайте Moxy docs (https://www.eclipse.org/eclipselink/documentation/2.4/moxy/advanced_concepts006.htm)
Я создал классы MarshallingPoint и MarshallingPointAdapter в том же пакете, что и структура классов, которую я пытаюсь сериализовать, и мой адаптер импортирует адаптеры jakarta.xml.bind.annotation..XmlAdapter вместо адаптеров javax.xml.bind.аннотации.XmlAdapter, используемый в примерах-теперь это должно быть правильно, верно? Во всяком случае, я также пробовал это с адаптерами javax.xml.bind.annotation..XmlAdapter с одинаковыми результатами.
Я использую файл привязки (и без аннотаций) с
<xml-java-type-adapters>
<xml-java-type-adapter value="MarshallingPointAdapter" type="java.awt.geom.Point2D"/>
</xml-java-type-adapters>
Когда я запускаю его, я получаю следующее:
«Недопустимый XmlJavaTypeАдаптер … был указан для пакета [tufts.sds]. Возможные причины-неправильное имя класса адаптера или был установлен неправильный загрузчик.»
Я получаю это независимо от того, что я изменяю, даже когда я переключаюсь на использование примера адаптера строк, который преобразует строки в верхний регистр (http://blog.bdoughan.com/2012/02/jaxb-and-package-level-xmladapters.html), я все еще получаю ту же ошибку.
Что, черт возьми, эта ошибка пытается мне сказать? Помогите!
На случай, если это прольет какой-либо свет, вот мой класс эрзац-точек:
package tufts.sds;
public class MarshallingPoint {
private int x, y;
public MarshallingPoint() {
this(0, 0);
}
public MarshallingPoint(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
}
А вот и мой адаптер:
package tufts.sds;
import java.awt.geom.Point2D;
import jakarta.xml.bind.annotation.adapters.XmlAdapter;
public class MarshallingPointAdapter extends XmlAdapter<MarshallingPoint, Point2D> {
public MarshallingPoint marshal(Point2D val) throws Exception {
return new MarshallingPoint((int) val.getX(), (int) val.getY());
}
public Point2D.Float unmarshal(MarshallingPoint val) throws Exception {
return new Point2D.Float(val.getX(), val.getY());
}
}
Комментарии:
1. Не ответ, просто замечание: я никогда не использовал файлы привязки — только связанные аннотации. Но я бы ожидал, что файл привязки должен будет ссылаться на полное имя класса-так, например:
value="tufts.sds.MarshallingPointAdapter"
. Кроме того, вы должны удалить то конечное пространство, которое у вас сейчас есть в вашем примере в вопросе.2. (И да, вы должны использовать
jakarta
пакеты сейчас.)3. Спасибо, Эндрю. Пробел в конце был опечаткой, но полные имена типов действительно были хитростью.
Ответ №1:
Как отметил Эндрю Джеймс в комментариях, проблема заключалась в том, что типы должны быть полностью квалифицированными.