2014-10-31 32 views
1

我現在正在與JAXB一起工作,並且我正在努力註釋我的複合前置條件查詢的概念,以便JAXB會很高興。JAXB和複合模式

的前提條件的查詢可以是:

  • 簡單:僅包含查詢
  • 化合物
    • 或文本節點:1個前提查詢的先決條件或其他比賽
    • AND: 1前提條件查詢AND其他匹配的前提條件

當然,複合查詢可製成複合查詢的,就像下面的例子:

<precondition> 
     <or> 
      <and> 
       <query>foo</query> 
       <query>bar</query> 
      </and> 
      <query>baz</query> 
     </or> 
    </precondition> 

在我的Java模型,我已經得到了,因爲JAXB註釋PreconditionQuery(實際上是一個抽象類,單一界面似乎對界面不滿意)與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不做這項工作,會有什麼?

回答

1

請嘗試添加

@XmlSeeAlso({PreconditionQuery.class}) 

CompoundAndPreconditionQuery類。

然後,嘗試使用@XmlRootElement註釋您所有的PreconditionQuery類/子類。

另外,要小心一點@XmlAccessorType - 有時你有它,有時不會。用它更好地註釋包裝。

最後,您可能需要與@XmlRegistry@XmlElementDecl,但我不認爲這是絕對必需的。

我認爲問題在於缺少@XmlRootElement/@XmlSeeAlso註釋。

@XmlElementRef被稱爲棘手,但它確實工作。 :)

祝你好運,祝願。

+0

謝謝,我馬上就試試看。 – Rolf 2014-11-01 09:23:06

+0

我更新了初始代碼示例以符合您的建議。 – Rolf 2014-11-02 15:33:26

+0

現在,JAXB不再抱怨了,但'query'總是'null'。 – Rolf 2014-11-02 15:52:32