JAXB и композитный рисунок
Я сейчас работаю с JAXB и изо всех сил пытаюсь аннотировать свое составное понятие запроса предусловия, чтобы JAXB был доволен.
Запрос предварительного условия может быть:
просто: только текстовый узел, содержащий запроссоединениеИЛИ: предварительные условия одного запроса предварительного условия ИЛИ другие совпаденияИ: предварительные условия 1 запроса предварительного условия И другие совпаденияКонечно, составные запросы могут быть сделаны из составных запросов, как в следующем примере:
<precondition>
<or>
<and>
<query>foo</query>
<query>bar</query>
</and>
<query>baz</query>
</or>
</precondition>
В моей модели Java у меня есть один аннотированный интерфейс PreconditionQuery (фактически абстрактный класс, поскольку JAXB кажется недовольным интерфейсами) с 3 реализациями SimplePreconditionQuery, CompoundOrPreconditionQuery и CompoundAndPreconditionQuery.
@XmlSeeAlso(PreconditionQuery.class)
@XmlRootElement(name = "query")
public class SimplePreconditionQuery extends PreconditionQuery {
private String query;
@XmlValue
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
}
Для составных (CompoundOrPreconditionQuery в основном одинаков):
@XmlSeeAlso(PreconditionQuery.class)
@XmlRootElement(name = "and")
public class CompoundAndPreconditionQuery extends PreconditionQuery {
private Collection<PreconditionQuery> preconditionQueries = newArrayList();
@XmlElementRef(name = "query")
public Collection<PreconditionQuery> getPreconditionQueries() {
return preconditionQueries;
}
public void setPreconditionQueries(Collection<PreconditionQuery> preconditionQueries) {
this.preconditionQueries = preconditionQueries;
}
}
Наконец, на уровне вмещающего бина я отобразил это так:
public class Precondition {
private PreconditionQuery query;
@XmlElementRef(required = true)
public PreconditionQuery getQuery() {
return query;
}
public void setQuery(PreconditionQuery query) {
this.query = query;
}
}
В конце концов, JAXB жалуется, что не может решить эту проблему:
Caused by: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Invalid @XmlElementRef : Type "class xxx.PreconditionQuery" or any of its subclasses are not known to this context.
this problem is related to the following location:
at public xxx.PreconditionQuery xxx.Precondition.getQuery()
at xxx.Precondition
Если@XmlElementRef
не делает работу, что будет?