Для чего 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 не хочет заниматься полной инжекцией зависимостей выше и выше установленного на основе атрибута параметра.
Это позор в некотором смысле, поскольку это означает, что эти классы не могут быть неизменными, но что компромисс должен быть сделан.