Для чего JAXB нужен общедоступный конструктор без аргументов?

Для чего JAXB нужен общедоступный конструктор без аргументов во время сортировки?

 Marshaller msh = ctx.createMarshaller();
 msh.marshal(object, System.out);

Я передаю объект, а не класс. Зачем JAXB нужен конструктор? Чтобы построить что?

3 ответа

Решение

Реализация JAXB не должна нуждаться в конструкторе без аргументов во время маршальной операции. JAXB действительно требует одного для unmarshalling. Обычно отсутствие конструктора без аргументов вызывает ошибку при создании JAXBContext. Используемая вами реализация JAXB может задерживать инициализацию до тех пор, пока не будет выполнена фактическая операция.

В общем, поддержка конструкторов с несколькими аргументами - это то, что мы должны рассмотреть в будущей версии JAXB. В реализации JAXB (MOXy) EclipseLink у нас открыт запрос на улучшение для этой функциональности (не стесняйтесь добавлять соответствующие детали):

В текущей версии JAXB вы можете использовать XmlAdapter для поддержки этого варианта использования:

Как уже отмечали другие, он не должен действительно нужен, но (по крайней мере, в реализации Sun) он нужен. Вы можете обойти это с помощью фиктивного конструктора:

private MyObject() {
    throw new UnsupportedOperationException("No-arg constructor is just to keep JAXB from complaining");
}

Так же, как и многие рамки - простота и последовательность. Это позволяет библиотеке просто вызывать Class.newInstance(), не беспокоясь о том, как указать определенные зависимости для конструктора, который их принимает. JAXB не хочет заниматься полнофункциональным внедрением зависимостей выше и за пределами настройки на основе атрибутов, которую он уже делает.

В некотором смысле это позор, потому что эти классы не могут быть неизменными, но это компромисс, который нужно сделать.

Другие вопросы по тегам