JAXB用空字段进行编组

这是一个非常简单的请求,但我没有find办法。

我基本上试图在JAXB中设置一个angular色,它表示无论何时遇到空字段,而不是在输出中忽略它,将其设置为一个空值。 所以对于这个class级:

@XMLRootElement Class Foo { Integer num; Date date; …. } 

当这个被编组到XML文件如果date字段为空,我的输出没有那个元素。 我想要做的是包括输出中的所有字段; 如果它们是空的,则用 – replace为空白。 所以输出应该是:

 <foo> <num>123</num> <date></date> </foo> 

谢谢,

Jalpesh。

谢谢你们的答案。

克里斯·戴尔 – 我尝试了你的方法,它并没有真正做我想要的。 JAXB仍然忽略我的空值,尽pipe为我的字段定义了默认值。

在泽西岛论坛有人指出我的文档部分2.2.12.8没有价值之后,我偶然发现了答案。

基本上,我所要做的就是在我的领域添加以下内容:

 @XmlElement(nillable = true) 

一旦我添加了这个,JAXB会把这些字段编组为XML,如下所示:

 ... <num>5</num> <date xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> .... 

但是,但是…一个空string不是一个date的有效的词汇表示,所以你不能这样做。 即如果您为date字段生成了一个空值的XML文档,它将无法正确validation。

换句话说,如果date元素的minOccurs为1或更多,而不是nillable ,那么你绝对必须有(1个或更多)date,它不能为空(或空白或其他非值)。

正如另一个答案所示,因为它不是一个有效的date是无效的。 我有一个类似的问题,我想特别处理(同样)。 由于您不能使用null,因此可以使用JAXB中的默认值机制。 如果没有指定,以下将默认值。 你可以通过代码检测这个特殊的date并处理这个exception情况。

 @XmlElement(defaultValue="1970-01-01T00:00:00.0-00:00") 

所以有可能检测到并清空date值,但你不能使用null来做到这一点。

在MOXY中,你可以指定jsonProvider如何为JAXB做它的工作。

所以在做JAX-RS的时候,在你的类中添加如下的代码

我在Tomcat 7上使用了这个代码,效果很好。 (eclipselink 2.4.1)

 @ApplicationPath("/rest") public class RestApplication extends Application { ... public Set< Object> getSingletons() { HashSet<Object> set = new HashSet<Object>(1); set.add( newMoxyJsonProvider()); return set; } public static MOXyJsonProvider newMoxyJsonProvider() { MOXyJsonProvider result = new MOXyJsonProvider(); //result.setAttributePrefix("@"); result.setFormattedOutput( false); result.setIncludeRoot( false); result.setMarshalEmptyCollections( true); //result.setValueWrapper("$"); return result; } 

然而,在Glassfish 3.1.2和WAS 8.5上,不需要newMoxyJsonProvider(),而是由服务器configurationJAXB提供者。 在MOXY附带的Glassfish的情况下,我目睹了与null值相同的问题。 还没有检查,但是如果可能的话,猜测答案是在应用服务器级别configurationJAXB。