2012-08-05 117 views
4

我最近在Eclipse中激活了我的WebServicesExplorer,我剛剛意識到由JAXB生成的xs:element名稱並不那麼冗長。這裏是序列之一:從該文件生成如何命名生成的wsdl中的xs:元素?

<xs:sequence> 
    <xs:element minOccurs="0" name="arg0" type="xs:string" /> 
    <xs:element minOccurs="0" name="arg1" type="xs:string" /> 
    <xs:element name="arg2" type="xs:int" /> 
</xs:sequence> 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class User { 
    private String firstName; 
    private String lastName; 
    private int age; 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 
} 

我不是一個JAXB專家,所以我不知道我是否可以更改這些ARG *命名的元素到的東西明智的,就像在POJO課程中一樣?

回答

1

您沒有提及您使用的是什麼Web服務框架,但其行爲聽起來與JAX-WS規範類似,例如, The parts in my generated wsdl have names of the form "arg0", "arg1", ... Why don't the parts (and Java generated from them) use the nice parameter names I typed into the interface definition?

官方答案:的JAX-WS規範(特別是3.6.1節),它可這樣來授權。要定製名稱,您必須使用@WebParam(name =「blah」)註釋來指定更好的名稱。 (您可以使用@WebResult作爲返回值,但如果您查看XML,則只會看到結果。)

原因: java的奧祕之一是抽象方法(以及接口方法)即使使用調試信息,也不會將它們的參數名稱編譯到它們中。因此,當從接口構建服務模型時,無法確定原始代碼中使用的名稱。

如果服務是從一個具體類(而不是一個接口)構建的,並且該類是用調試信息編譯的,我們可以獲取參數名稱。簡單的前端這樣做。但是,這可能會導致潛在的問題。例如,當您從開發到生產時,您可能會關閉調試信息(從javac標誌中刪除-g),並且由於生成的wsdl(並因此期望肥皂消息)會發生變化,因此突然應用程序可能會中斷。因此,JAX-WS規範編寫者走上了安全的路線,並且要求您必須使用@WebParam註釋來指定更具描述性的名稱。

您可以嘗試爲每個字段添加一個XmlElement註釋並指定一個名稱,但是您確定這是由JAXB引起的嗎?如果我運行schemagen你的POJO的代碼,這是我所得到的(名字都正確拾起):基於您的評論

<xs:complexType name="user"> 
    <xs:sequence> 
     <xs:element name="age" type="xs:int"/> 
     <xs:element name="firstName" type="xs:string" minOccurs="0"/> 
     <xs:element name="lastName" type="xs:string" minOccurs="0"/> 
    </xs:sequence> 
</xs:complexType> 

,如果你「逼」你的POJO下面的代碼,你仍然可以得到有關重複名稱的投訴?

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlAccessType; 

@XmlAccessorType(XmlAccessType.NONE) 
@XmlRootElement 
public class User { 
    @XmlElement(name = "firstName") 
    private String firstName; 

    @XmlElement(name = "lastName") 
    private String lastName; 

    @XmlElement(name = "age") 
    private int age; 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 
} 
+0

我正在使用Apache Cxf,因此它是JAX-WS + JAXB組合。我已經嘗試了@XmlElement註解,這導致了「重名」異常被拋出。 – 2012-08-10 14:59:09

+0

@edem:我改變了我的回答以迴應您的評論。看看它是否有幫助。 – Bogdan 2012-08-11 10:40:39