Сбой XmlAdapter JAXB/MOXY с возможными причинами: неверное имя класса адаптера или установлен неправильный загрузчик

#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:

Как отметил Эндрю Джеймс в комментариях, проблема заключалась в том, что типы должны быть полностью квалифицированными.