原文地址:[https://jaxb.java.net/tutorial/section_6_2_5-Controlling-Element-Selection-XmlAccessorType-XmlTransient.html#Controlling Element Selection: XmlAccessorType, XmlTransient](https://jaxb.java.net/tutorial/section_6_2_5-Controlling-Element-Selection-XmlAccessorType-XmlTransient.html#Controlling Element Selection: XmlAccessorType, XmlTransient)
如果JAXB將一個類綁定到了XML藏杖,那么默認(rèn)地喷面,所有的public成員將會被綁定狗超。比如网杆,公共的getter和setter方法對删豺,或者公共的field霸饲。任何protected骡尽,package-visible或者private的成員都會被綁定久窟,如果它被添加了一個合適的注解,比如@XmlElement
或者@XmlAttribute
蚂子。你有若干的可能性來影響它的默認(rèn)行為沃测。
你可以將一個package或者一個頂層的class用@XmlAccessorType
來注解,然后設(shè)置它的value元素的值為枚舉常量中的其中一個(FIELD
, PROPERTY
, PUBLIC_MEMBER
, NONE
)食茎。如果FIELD
被設(shè)置蒂破,那么每一個非static和非transient的field將會被自動地綁定。設(shè)置為PROPERTY
可以告訴JAXB去為getter和setter方法對做數(shù)據(jù)綁定别渔。NONE
的設(shè)置會禁止綁定附迷,除了對那些已經(jīng)被明確注解的field或property。一個沒有使用這個注解的類將會從它的父類或者package設(shè)置中繼承哎媚。
另一個在這個上下文中被提及的注解是@XmlTransient
喇伯。它會為它的target阻止綁定操作,這個target可以是一個class或者一個field或者一個method拨与。如果你遇到了從public field導(dǎo)致的名字沖突(拿foo來說稻据,getFoo和setFoo),那么使用@XmlTransient
將會是很有用的买喧。
第一個class將訪問類型設(shè)置為PUBLIC_MEMBER
來限制一組XML元素捻悯。成員getB
在綁定的時候?qū)绘i定匆赃。
@XmlAccessorType( XmlAccessType.PUBLIC_MEMBER )
public class SomeClass {
private String a;
private String b;
public SomeClass(){ ... }
public String getA(){ ... }
public void setA( String value ){ ... }
@XmlTransient
public String getB(){ ... }
public void setB( String value ){ ... }
}
與其對應(yīng)的XML schema類型定義將會像下面這樣:
<xs:complexType name="someClass">
<xs:sequence>
<xs:element name="a" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
第二個例子展示了反向的過程。它展示了一個被設(shè)置為最高限制訪問類型的class今缚,這個class有一個成員被明確注解成為一個element算柳。
@XmlAccessorType( XmlAccessType.NONE )
public class OtherClass {
private String a;
private String b;
public OtherClass(){ ... }
public String getA(){ ... }
public void setA( String value ){ ... }
@XmlElement( required = true )
public String getB(){ ... }
public void setB( String value ){ ... }
}
由于我們已經(jīng)將element的注解設(shè)置為true,那么生成的schema片段就將會有一點點不同:
<xs:complexType name="otherClass">
<xs:sequence>
<xs:element name="b" type="xs:string"/>
</xs:sequence>
</xs:complexType>
最后這個例子展示了使用這些注解在一些特殊的情況下姓言。首先瞬项,@XmlTransient
被用在public field上來避免方法對的名字沖突。其次何荚,@XmlElement
被用來為getB請求綁定囱淋,而它并沒有自己的setB配偶。(getter方法遵循JAXB為elements綁定到List<?>所生成Java代碼的標(biāo)準(zhǔn)模式兽泣,在list對象上有一些改變)
@XmlAccessorType( XmlAccessType.PUBLIC_MEMBER )
public class SpecialClass {
@XmlTransient
public String a;
private List<String> b;
public SpecialClass(){ ... }
public String getA(){ ... }
public void setA( String value ){ ... }
@XmlElement
public List<String> getB(){
if( b == null ) b = new ArrayList<String>();
return b;
}
}
生成的復(fù)合類型會將兩個element都包含在內(nèi)绎橘。
<xs:complexType name="specialClass">
<xs:sequence>
<xs:element name="a" type="xs:string" minOccurs="0"/>
<xs:element name="b" type="xs:string" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
總的來看,你可以通過在package級別設(shè)置唠倦,給在一個包中的所有class指定策略称鳞;或者通過在class級別設(shè)置,給它所有的子類指定策略稠鼻。這個策略可以在field或者property上冈止,并且是很寬松的。也可以是很嚴(yán)格地默認(rèn)什么也不允許候齿。在這個class中熙暴,你可以通過添加@XmlElement
或者@XmlAttribute
來擴(kuò)展一個限制嚴(yán)格的設(shè)置』哦ⅲ或者你可以使用@XmlTransient
注解來禁止綁定周霉。