2012-02-03 35 views
6

JAXB正在生成的方法,如: isIsBuyNow()isHasBuyNow()當我想isBuyNow()hasBuyNow()如何刪除「是」從JAXB生成布爾干將

生成許多許多類方法,因此單獨定製生成的方法名稱是不可行的。

某些定製JAXB的正則表達式規則是首先想到的,但我找不到任何這種通用方法來更改方法名稱。

回答

2

從它的聲音你只需要改變方法名稱,而不是類名稱。您可能能夠之一:

  1. 找到XJC的插件,允許這一點,或
  2. 寫的XJC的插件,這是否

我懷疑的第一個選項存在(儘管你可能會得到幸運),但第二個選項似乎非常簡單。有關如何編寫自己的帖子,請參閱this page

+0

您可以使用標準(JSR-222)外部綁定文件自定義屬性名稱,並且不需要外部插件:http://stackoverflow.com/a/9127208/383861 – 2012-02-03 10:45:03

1

在執行插件路由之前。我會強調核心你的變量名稱。它應該按照Java Bean的慣例。而JAXB應該只按照那個工作。

所以如果變量是布爾值,ist應該是buyNow。各自的getter方法將成爲你所需要的isBuyNow()。這將是再次重新生成映射的問題。沒有regeex沒有自定義查找/替換,因爲您(正確)想要:)

+0

模式I我使用的是第三方,而且我不能改變它,不幸的是。 – Kevin 2012-02-03 05:52:48

+0

哦,我應該猜到了:( – 2012-02-03 06:43:27

+1

你可能會提供一個不同的propertyName,就像在這裏定製屬性binbdings中提到的那樣 - http://docs.oracle.com/cd/E17802_01/webservices/webservices/docs/ 2.0/tutorial/doc/JAXBUsing4.html#wp148590 – 2012-02-03 06:51:33

3

您可以使用外部綁定文件來自定義您的屬性名稱。爲了讓JAXB將方法識別爲屬性,它必須遵循以布爾類型開頭的約定getis

schema.xsd

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="root"> 
     <xs:attribute name="is-buy-now" type="xs:boolean"/> 
    </xs:complexType> 

</xs:schema> 

綁定。XML

在綁定文件下面我們指定的屬性名稱的XML屬性名爲is-buy-now

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 
    <jxb:bindings schemaLocation="is.xsd"> 
     <jxb:bindings node="//xs:complexType[@name='root']/xs:attribute[@name='is-buy-now']"> 
     <jxb:property name="buyNow"/> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

XJC呼叫

-b選項用於指定綁定文件:

xjc -d out -b bindings.xml schema.xsd 

結果下面的類將產生:isBuyNowsetBuyNow方法:

// 
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2012.02.03 at 05:18:59 AM EST 
// 


package generated; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlAttribute; 
import javax.xml.bind.annotation.XmlType; 


/** 
* <p>Java class for root complex type. 
* 
* <p>The following schema fragment specifies the expected content contained within this class. 
* 
* <pre> 
* &lt;complexType name="root"> 
* &lt;complexContent> 
*  &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> 
*  &lt;attribute name="is-buy-now" type="{http://www.w3.org/2001/XMLSchema}boolean" /> 
*  &lt;/restriction> 
* &lt;/complexContent> 
* &lt;/complexType> 
* </pre> 
* 
* 
*/ 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "root") 
public class Root { 

    @XmlAttribute(name = "is-buy-now") 
    protected Boolean buyNow; 

    /** 
    * Gets the value of the buyNow property. 
    * 
    * @return 
    *  possible object is 
    *  {@link Boolean } 
    *  
    */ 
    public Boolean isBuyNow() { 
     return buyNow; 
    } 

    /** 
    * Sets the value of the buyNow property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link Boolean } 
    *  
    */ 
    public void setBuyNow(Boolean value) { 
     this.buyNow = value; 
    } 

} 

UPDATE

如果從Java類開始,你可以指定@XmlAccessorType(XmlAccessType.FIELD)按照您選擇的方式映射到字段並命名您的方法:

@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 

    @XmlAttribute(name="has-buy-now") 
    private boolean buyNow; 

    public boolean hasBuyNow() { 
     return buyNow; 
    } 

} 
+1

+ 1也是一個完整的例子我的懶骨頭:) – 2012-02-03 10:58:52

+0

如果有說法,100種方法,is-buy-now,is-expired,is-reserve-met等等,看起來這個解決方案會讓我寫幾百行bindings.xml文件是這種情況,還是我誤解了? – Kevin 2012-02-03 23:18:32

+0

用這種方法你是對的。如果你有很多這些屬性,你可以利用@KalebBrasee給出的方法:http://stackoverflow.com/a/9123497/383861 – 2012-02-04 11:53:55