2015-01-07 217 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