Для чего JAXB нужен публичный конструктор no-arg?

Что для JAXB нужен публичный конструктор no-arg для во время сортировки?

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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