2015-01-07 155 views
3

我有一個非常簡單的問題就在這裏,但現在使用谷歌了一個多小時後,我仍然無法找到一個很好的解決方案,它開始花費太多的錢..編組與JAXB嵌套對象 - 解開

在我的應用程序中,我使用REST作爲API,基本上只使用JSON作爲有效內容類型,並闡明API的文檔。正如您可能知道的那樣,聲明將從類生成一個xsd模式。我因此處於這種情況,我需要使用合適的註釋配置所有DTO的Jackson/JSON處理,並且還需要使用JAXB註釋來確保生成的模式是正確的,並且可以使用XJC將其分析到正確的類中!

儘管在大多數情況下這並不是很難實現並且工作完美,但我有一個簡單但特殊的情況,它完全失敗了。

假設下面的類:

@JsonRootName(value = "location") 
 
public class Location { 
 
    
 
    private String label; 
 
    
 
    @JsonUnwrapped 
 
    private Address address; 
 
    
 
    // constructors, getters, setters ommited.. 
 
} 
 

 

 
//// new file 
 

 
public class Address{ 
 
    
 
    private String city; 
 
    private String street; 
 
    private String postCode; 
 
    
 
}

這工作100%和Jackson/JSON。嵌入地址對象將被解開,以使JSON看起來像這樣:

{ 
 
    "label":"blah", 
 
    "street":"Exchange Road", 
 
    "city":"Stacktown" 
 
    "postCode":"1337" 
 
}

這工作來回傑克遜。另一方面,JAXB能夠解析(大部分)Jackson註釋,所以一般而言,在兩個世界中使用簡單對象都不會有問題。儘管JJSONB不支持@JsonUnwrapped,奇怪的是(從我的POV)很簡單的用例似乎根本不能反映任何JAXB註釋。

會發生什麼是生成的模式包含嵌入的地址對象,沒有任何屬性/元素。因此,由XJC生成的類將包含該地址對象引用。這最終會導致錯誤的JSON從應用程序,將使用架構來生成對象...

任何想法?

回答

1

JAXB (JSR-222)規範沒有定義與傑克遜的@JsonUnwrapped等效。很長一段時間,我們通過@XmlPath擴展在JAXB的EclipseLink MOXy實現中提供了該功能。

@XmlPath(".") 
    private Address address; 

更多信息

我已經寫了更多關於莫西的@XmlPath擴展在我的博客:

+0

我知道....可悲的是字正腔圓依賴JAXB。無論如何,我只是接受了這個事實,即我現在在我的json中嵌套了Address對象。實際上並沒有太大的傷害。 – skombijohn