2014-02-14 4 views
1

JAXB жалуется, что класс X «... не имеет конструктора без аргументов по умолчанию.»@XmlJavaTypeAdapter на абстрактном классе?

класса X в моем случае это один из десятков автоматически сгенерированных, конечных классов, действительно, не имеют конструктора default-no-arg. Также происходит расширение класса , который я могу изменить, если захочу. Я думал о размещении аннотации @XmlJavaTypeAdapter на абстрактном классе, но это не работает, и я не уверен, что это даже имеет смысл. Какое лучшее решение или обходное решение для этого?

EDIT: Просто, чтобы быть чистым. Я не могу изменить сгенерированные классы.

ответ

0

положить конструктор без аргументов в этом классе, как это:

public ClassName(){ 
} 
0

Часто бывает так, что (из-за рамок), необходимо не-арг конструктор. Например, при работе с JAXB для компонентов, которые он создает, требуется конструктор no-args. То, что я часто делаю это:

public MyClass(String something) { 
    // do something 
} 

public MyClass() { 
    // for frameworks! 
} 

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

PS: в некоторых структурах есть аннотации, допускающие вызовы @PostConstruct.

+0

Я понимаю, что это необходимо JAXB, но я не могу просто добавить его к автоматически созданным классам. В любом случае это нежелательно, потому что это означает, что класс можно построить, не передавая «что-то» (отвечая на ваш ответ в качестве примера). Хотя я мог бы видеть, могу ли я иметь классы, созданные с помощью частного конструктора no-arg, - это обходной путь, но я надеялся, что JAXB может предложить что-то само по себе. – chrisjleu

+0

Если вы не можете создать конструктор no-args, то я не уверен, что можно использовать JAXB, как именно вы скажете, какой конструктор использовать и какие аргументы должны пройти для каждого экземпляра? Возможно, фундаментальное переосмысление дизайна необходимо, потому что это кажется странной ситуацией? – nablex

+0

Это действительно странная и неудобная ситуация. Но иногда, к сожалению, приходится работать с устаревшим кодом, который не может быть легко изменен, может быть недоступен для вас или быть слишком дорогостоящим для рефакторинга ... На самом деле это вопрос для эксперта JAXB, который знает о трюке или двух. – chrisjleu

1

Вы можете добавить XmlAdapter в абстрактный суперкласс (см. http://blog.bdoughan.com/2012/01/jaxb-and-inhertiance-using-xmladapter.html). Важно отметить, что XmlAdapter будет применяться только к отображаемым полям/свойствам, которые ссылаются на класс, а не когда экземпляр этого класса сортируется как корневой объект. Вы также не сможете включить этот класс в массив классов, переданных в bootstrap JAXBContext.

+0

Я не уверен, что я понимаю, что «важно отметить ...» часть вашего ответа. Ваш блог, который я прочитал до публикации вопроса, фактически требует, чтобы адаптер знал обо всех классах реализации. В моем случае существует около 50 классов, которые расширяют абстрактный класс, и они могут меняться в любое время. Возможно, я прошу невозможного, если я скажу, что мне хотелось бы, чтобы JAXB мог маршировать все, что расширяет абстрактный класс ... – chrisjleu

Смежные вопросы