Видя, что никто не ответил на этот вопрос, я сам отвечу на него.
В Apache CXF, сгенерированном компоненте WS, все получатели возвращают объект not null
, что означает, что если переменная имеет значение null, то происходит следующее:
public List<? extends User> getParents() {
if (parents == null) {
parents = new ArrayList<User>();
}
return this.parents;
}
Как видите, следующее вызывает исключение для CXF:
- Сериализуемый класс - это интерфейс, поэтому, если у меня есть переменная типа
Serializable
, new Serializable()
не может быть определена, когда CXF генерирует исходный код клиента.
- Весь объект должен реализовать конструктор
public
.
Отказ по двум принципам, вызывает исключение выше.
Решение
Для атрибута private List<? extends User> parents
мы добавили это.
@XmlElements({
@XmlElement(type=Man.class),
@XmlElement(type=Female.class),
@XmlElement(type=Child.class)
})
private List<? extends User> parents;
А для интерфейсов мы использовали XmlJavaTypeAdapter
и написали адаптер для каждого реализованного подкласса этого интерфейса,
* 1 033 * например,
public class IntegerConstraintBaseAdapter extends XmlAdapter<IntegerConstraint, ConstraintBase<Integer>> {
/* (non-Javadoc)
* @see javax.xml.bind.annotation.adapters.XmlAdapter#marshal(java.lang.Object)
*/
@Override
public IntegerConstraint marshal(ConstraintBase<Integer> v) throws Exception {
// TODO Auto-generated method stub
return null;
}
/* (non-Javadoc)
* @see javax.xml.bind.annotation.adapters.XmlAdapter#unmarshal(java.lang.Object)
*/
@Override
public ConstraintBase<Integer> unmarshal(IntegerConstraint v) throws Exception {
// TODO Auto-generated method stub
return null;
}
}
Надеюсь, это кому-нибудь поможет.