2010-02-17 54 views
2

考慮下面的類(請假設私有字段的公共getter和setter方法)。如何使用JAX-WS/JAXB編寫參數化類型?

// contains a bunch of properties 
public abstract class Person { private String name; } 

// adds some properties specific to teachers 
public class Teacher extends Person { private int salary; } 

// adds some properties specific to students 
public class Student extends Person { private String course; } 

// adds some properties that apply to an entire group of people 
public class Result<T extends Person> { 
    private List<T> group; 

    private String city; 
    // ... 
} 

我們可能有以下的Web服務實現如下註解:

@WebService 
public class PersonService { 

    @WebMethod 
    public Result<Teacher> getTeachers() { ... } 

    @WebMethod 
    public Result<Student> getStudents() { ... } 
} 

的問題是,JAXB似乎馬歇爾結果對象爲Result<Person>,而不是具體類型。因此,由getTeachers()返回的結果序列化爲包含List<Person>而不是List<Teacher>,並且getStudents()也是相同的,必須作必要的修改。

這是預期的行爲?我是否需要在Person上使用@XmlSeeAlso?

謝謝!

LES

+0

你能給出一個結果XML嗎? – Bozho 2010-02-17 06:17:41

+0

我實際上使用返回JSON數據的JAX-WS JSON插件。 getTeachers示例的示例爲:{city:「Memphis」,group:[{name:「Johnny」}]}。也就是說,「薪水」不會出現。 getStudents也一樣 - 它會像上一個例子一樣(當然不會顯示)。我現在不在我的開發箱中,這就是爲什麼我不能發佈WSDL的實例或生成的模式或XML通過SOAP使用SoapUI訪問服務的原因。 – les2 2010-02-17 06:25:44

回答

0

這個問題的答案相當棘手。事實證明,由jax-ws json插件使用的拋棄版本有點舊(1.0-beta-1 IIRC)。該特定版本不能很好地處理這種情況(它崩潰)。如果您確實添加了@XmlSeeAlso,那麼JSON編組將會崩潰!當然,這很糟糕!

我在一些論壇上閱讀(沒有鏈接 - 這是全部來自內存),jax-ws json插件沒有被主動維護。如果您嘗試1)從jax-ws json依賴項(假設爲maven here)中排除默認的jettison依賴項並添加更新的版本,則會得到關於JSONException的錯誤不存在的錯誤。 Jax-ws json不會使用更新版本的jettison(我試過)。

這是記錄在另一個網站(有人表示,他們希望有人將jax-ws json移植到最新的拋棄)。

最後,我切換到遠程DWR。 JAX-WS最好留給系統到系統(後端)集成。這對於前端來說太重了。 DWR在這種情況下非常有效。

找到指向論壇的鏈接我閱讀:http://forums.java.net/jive/thread.jspa?messageID=384385。請注意,Collab.net目前正在進行維護,但它們很快會恢復。至於回答一般問題(沒有JAX-WS JSON插件部分),答案是肯定的 - 你必須在Person類上使用@XmlSeeAlso註釋。否則模式將只包含Person而不包含Teacher或Student元素。只有在Person中定義的元素沒有使用@XmlSeeAlso批註進行編組。

+0

我看到這個職位是兩歲。你目前用什麼來實現一個帶有JSON的WebMethod? – 2012-12-06 17:24:15

+1

我認爲球衣將在java的詩節標準? (如果你想要寧靜的服務)。 spring mvc也使這個微不足道,只需在控制器方法上添加ResponseBody註釋並在RequestMapping註釋中指定application/json的內容類型即可。有時候我會用grails(儘管我並不完全被贏)。 – les2 2012-12-07 16:05:41

相關問題