2012-05-29 38 views
21

這是我的XML文件:我不明白爲什麼這個JAXB IllegalAnnotationException拋出

<fields> 
    <field mappedField="Num"> 
    </field> 

    <field mappedField="Type">  
    </field>  
</fields> 

我做了2類分析它(Fields.java和Field.java):

@XmlRootElement(name = "fields") 
public class Fields { 

    @XmlElement(name = "field") 
    List<Field> fields = new ArrayList<Field>(); 
     //getter, setter 
} 

public class Field { 

    @XmlAttribute(name = "mappedField") 
    String mappedField; 
    /getter,setter 
} 

但我得到這個例外。

[INFO] com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
[INFO] at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:66) ~[na:1.6.0_07] 
[INFO] at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:422) ~[na:1.6.0_07] 
[INFO] at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:270) ~[na:1.6.0_07] 

我不明白爲什麼這個例外會上升。例外是:

JAXBContext context = JAXBContext.newInstance(Fields.class); 

我使用JDK 1.6_0.0.7。謝謝。

+1

你能否嘗試並替換你的屬性名稱?這可能是'field'關鍵字實際上是保留的。 – npinti

+0

@MyTitle你的代碼將正常工作,如果你只是在你的類中移除了setter方法,因爲你的xml正在設置值的屬性。如果你說你需要類中的getter&setter方法,那麼在你的類名上面加上「@XmlAccessorType(XmlAccessType.FIELD)」,在「@XmlRootElement」註釋後面加上,它工作正常。 – mannedear

回答

40

異常是由於您的JAXB(JSR-222)實現認爲有兩件事情使用相同的名稱(字段和屬性)映射。有您的使用情況下兩個選擇:

選項1 - 與@XmlAccessorType(XmlAccessType.FIELD)

註釋字段如果你想註釋字段,那麼你應該指定@XmlAccessorType(XmlAccessType.FIELD)

領域。 Java的:

package forum10795793; 

import java.util.*; 
import javax.xml.bind.annotation.*; 

@XmlRootElement(name = "fields") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Fields { 

    @XmlElement(name = "field") 
    List<Field> fields = new ArrayList<Field>(); 

    public List<Field> getFields() { 
     return fields; 
    } 

    public void setFields(List<Field> fields) { 
     this.fields = fields; 
    } 

} 

Field.java:

package forum10795793; 

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Field { 

    @XmlAttribute(name = "mappedField") 
    String mappedField; 

    public String getMappedField() { 
     return mappedField; 
    } 

    public void setMappedField(String mappedField) { 
     this.mappedField = mappedField; 
    } 

} 

選項#2 - 註釋屬性

缺省存取類型是XmlAccessType.PUBLIC。這意味着默認情況下,JAXB實現將公共字段和訪問器映射到XML。使用默認設置,您應該在公共訪問器中註釋要覆蓋默認映射行爲的位置。

Fields.java:

package forum10795793; 

import java.util.*; 
import javax.xml.bind.annotation.*; 

@XmlRootElement(name = "fields") 
public class Fields { 

    List<Field> fields = new ArrayList<Field>(); 

    @XmlElement(name = "field") 
    public List<Field> getFields() { 
     return fields; 
    } 

    public void setFields(List<Field> fields) { 
     this.fields = fields; 
    } 

} 

場。Java的:

package forum10795793; 

import javax.xml.bind.annotation.*; 

public class Field { 

    String mappedField; 

    @XmlAttribute(name = "mappedField") 
    public String getMappedField() { 
     return mappedField; 
    } 

    public void setMappedField(String mappedField) { 
     this.mappedField = mappedField; 
    } 

} 

更多信息

+1

你沒錯,謝謝) – MyTitle

+0

這有幫助,但實際問題對我來說,雖然該字段被正確註釋,但它已從在類級別@XmlType註釋中定義的propOrder屬性中丟失。 – Pytry

+0

如果在同一個JAR中還有其他類未被代碼引用,那麼它們是否也需要註釋?我有一個JAXB SOAP服務給出了相同的錯誤,並且註釋了沒有成功返回的類,但是在同一個JAR中還有許多其他類。 –

6

下列情況之一可能會導致異常:

  1. 添加一個空的公共構造你的域類,JAXB使用 反射來加載類,這就是爲什麼會拋出異常。
  2. 爲您的列表添加單獨的getter和setter。
7

這是因爲,在默認情況下,JAXB當序列化一個POJO,查找註釋通過公共成員(getter或setter)的屬性。但是,您在字段上提供註釋。因此,請更改設置器或屬性獲取器上的註釋,或者將XmlAccessortype設置爲字段。

選項1 ::

@XmlRootElement(name = "fields") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Fields { 

     @XmlElement(name = "field") 
     List<Field> fields = new ArrayList<Field>(); 
     //getter, setter 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Field { 

     @XmlAttribute(name = "mappedField") 
     String mappedField; 
     //getter,setter 
} 

選項2 ::

@XmlRootElement(name = "fields") 
public class Fields { 

     List<Field> fields = new ArrayList<Field>(); 

     @XmlElement(name = "field") 
     public List<Field> getFields() { 

     } 

     //setter 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Field { 

     String mappedField; 

     @XmlAttribute(name = "mappedField") 
     public String getMappedField() { 

     } 

     //setter 
} 

對於更多的細節和深度,檢查以下JDK文檔http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlAccessorType.html

18

我不明白爲什麼此JAXB IllegalAnnotationException拋出

我也遇到了### counts of IllegalAnnotationExceptions異常,它似乎是由於我的Spring接線中依賴層次結構不正確。

我想通過在JAXB代碼中添加一個斷點來解決這個問題。對我來說,這是在com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check()。然後我甩了list變量,它給出了類似:

[org.mortbay.jetty.Handler is an interface, and JAXB can't handle interfaces. 
this problem is related to the following location: 
    at org.mortbay.jetty.Handler 
    at public org.mortbay.jetty.Handler[] org.mortbay.jetty.handler.HandlerCollection.getHandlers() 
    at org.mortbay.jetty.handler.HandlerCollection 
    at org.mortbay.jetty.handler.ContextHandlerCollection 
    at com.mprew.ec2.commons.server.LocalContextHandlerCollection 
    at private com.mprew.ec2.commons.server.LocalContextHandlerCollection com.mprew.ec2.commons.services.jaxws_asm.SetLocalContextHandlerCollection.arg0 
    at com.mprew.ec2.commons.services.jaxws_asm.SetLocalContextHandlerCollection, 
org.mortbay.jetty.Handler does not have a no-arg default constructor.] 
.... 

does not have a no-arg default constructor在我看來是一種誤導。也許我並不理解這個例外的意思。但它確實表明我的LocalContextHandlerCollection存在問題。我刪除了一個依賴循環並清除了錯誤。

希望這會對其他人有所幫助。

+0

謝謝!當相同的代碼在不同的環境中拋出'IllegalAnnotationsException'時,這是唯一幫助我的東西。原來,[Java/JAXB的版本非常重要](http://stackoverflow.com/questions/19642792/what-might-cause-jaxbelement-does-not-have-a-no-arg-default-constructor)。不過,「沒有無參數的默認構造函數」確實是我的問題。添加一個修復它! – insanity

+2

你的答案解決了我的問題。我不期待一個'無參數的默認構造函數'引起的問題。謝謝! –

+1

堆棧跟蹤丟失了關鍵信息。設置斷點發現問題。 –

1

我曾經在考慮將@XmlTransient放在我不需要序列化的字段中之後收到此消息,該字段在註釋爲@XmlAccessorType(XmlAccessType.NONE)的類中。

在這種情況下,刪除XmlTransient解決了問題。我不是JAXB的專家,但我懷疑是因爲AccessType.NONE表示不應該完成自動序列化(即字段必須特別註釋以序列化它們),這使得XmlTransient非法,因爲它的唯一目的是從auto -serialization。

0

我有這個相同的問題,我傳遞一個spring bean作爲ResponseBody對象。當我交回由新創建的對象時,一切都很好。

0

我有同樣的問題

我的問題

Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions 

Two classes have the same XML type name "{urn:cpq_tns_Kat_getgroupsearch}Kat_getgroupsearch". Use @XmlType.name and @XmlType.namespace to assign different names to them. 
this problem is related to the following location: 
at katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearch 
at public javax.xml.bind.JAXBElement katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory.createKatGetgroupsearch(katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearch) 
at katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory 
this problem is related to the following location: 
at cpq_tns_kat_getgroupsearch.KatGetgroupsearch 

Two classes have the same XML type name "{urn:cpq_tns_Kat_getgroupsearch}Kat_getgroupsearchResponse0". Use @XmlType.name and @XmlType.namespace to assign different names to them. 
this problem is related to the following location: 
at katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0 
at public javax.xml.bind.JAXBElement katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory.createKatGetgroupsearchResponse0(katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0) 
at katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory 
this problem is related to the following location: 
at cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0 

改變以解決它低於

我改變各自的名字命名空間

@XmlAccessorType(XmlAccessType.FIELD) @XmlType(**name** = 
    "Kat_getgroupsearch", propOrder = { 

    @XmlAccessorType(XmlAccessType.FIELD) @XmlType(namespace = 
    "Kat_getgroupsearch", propOrder = { 


@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(**name** = "Kat_getgroupsearchResponse0", propOrder = { 

    @XmlAccessorType(XmlAccessType.FIELD) 
    @XmlType(namespace = "Kat_getgroupsearchResponse0", propOrder = { 

爲什麼?

由於在錯誤日誌中編寫了兩個類具有相同的名稱,所以我們應該使用名稱空間,因爲XML名稱空間用於在XML文檔中提供唯一命名的元素和屬性。

0

以下所有選項都適用於我。

選項1:詮釋FIELD在吸氣劑/ setter方法

@XmlRootElement(name = "fields") 
@XmlAccessorType(XmlAccessType.FIELD) 
    public class Fields { 

     @XmlElement(name = "field") 
     List<Field> fields = new ArrayList<Field>(); 
      //getter, setter 
    } 

選項2類&現場級:在類級(@XmlAccessorType(XmlAccessType.FIELD)中,用僅getter方法沒有詮釋領域。增加setter方法將拋出,因爲我們不包括在這種情況下,註釋錯誤記住,當你明確地設置在XML文件中的值不需要二傳手

@XmlRootElement(name = "fields") 
    public class Fields { 

     @XmlElement(name = "field") 
     List<Field> fields = new ArrayList<Field>(); 
      //getter 
    } 

方案3:標註在getter方法獨自一人。請記住,我們也可以在這裏使用setter方法,因爲在這種情況下我們沒有執行任何FIELD級別的註釋。

@XmlRootElement(name = "fields") 
    public class Fields { 

     List<Field> fields = new ArrayList<Field>(); 

     @XmlElement(name = "field") 
     //getter 

     //setter 
    } 

希望這能幫助你!

相關問題