当前位置: 首页 > 面试题库 >

JAXB Marshaller没有元素whos的值为null

左丘昊天
2023-03-14
问题内容

当我使用JAXB Marshaller编组Java对象时,编组器不会在Java对象中为空文件创建空元素。例如,我有以下java对象:

public class PersonTraining {

    @XmlElement(name = "Val1", required = true)
    protected BigDecimal val1;
    @XmlElement(name = "Val2", required = true, nillable = true)
    protected BigDecimal val2;
    @XmlElement(name = "Val3", required = true, nillable = true)
    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar val3;
}

当我获取该对象的实例并将其编组为XML时,将得到以下信息(这是因为我没有设置Val2的值):

<PersonTraining>
      <Val1>1</Val1>
       <Val3>2010-01-01T00:00:00.0-05:00</Val3>
 </PersonTraining>

但是,我曾期望编组操作具有以下结果(事实上,我还特别需要元素,以便可以根据XSD验证XML)

<PersonTraining>
      <Val1>1</Val1>
      <Val2></Val2>
       <Val3>2010-01-01T00:00:00.0-05:00</Val3>
 </PersonTraining>

请让我知道我需要设置什么选项,以便也可以将对象属性中的空值编组,并以空/空元素的形式返回。

这是编组代码:

StringWriter sw = new StringWriter();
JAXBContext jc = JAXBContext.newInstance("person_training");   
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
m.marshal(ptl, sw);

问题答案:

默认情况下, JAXB(JSR-222)
实现不会编组空值的属性/元素。对于Java模型中的以下字段,这将是正确的。

@XmlElement(name = "Val1", required = true)
protected BigDecimal val1;

您可以像在此处所做的那样通过nillable=true@XmlElement注释上指定来覆盖此行为:

@XmlElement(name = "Val2", required = true, nillable = true)
protected BigDecimal val2;

这将使该xsi:nil="true"属性具有杠杆作用:

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

想要查询更多的信息:

  • http://blog.bdoughan.com/2012/04/binding-to-json-xml-handling-null.html

Java模型

人员培训

由于要进行注释,因此fields应确保@XmlAccessorType(XmlAccessType.FIELD)在类或包级别进行指定(请参阅:http : //blog.bdoughan.com/2011/06/using-jaxbs-
xmlaccessortype-to.html
)。

import java.math.BigDecimal;
import javax.xml.bind.annotation.*;
import javax.xml.datatype.XMLGregorianCalendar;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class PersonTraining {

    @XmlElement(name = "Val1", required = true)
    protected BigDecimal val1;
    @XmlElement(name = "Val2", required = true, nillable = true)
    protected BigDecimal val2;
    @XmlElement(name = "Val3", required = true, nillable = true)
    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar val3;

}

示范代码

演示版

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(PersonTraining.class);

        PersonTraining pt = new PersonTraining();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(pt, System.out);
    }

}

输出量

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<personTraining>
    <Val2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
    <Val3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</personTraining>


 类似资料:
  • 我是硒的新手,请帮帮我。整个代码: 如何为以粗体突出显示的元素选择xpath?我试过很多例子,但不幸的是没有一个像预期的那样有效。任何帮助都会很好。

  • “进入库存警报”对象 我不想单击“添加到购物车”。我只想把定位器信息存储在WebElement“AddToCart”中。因为对象具有非常相同的属性,所以我选择了这个唯一的属性“data-tl-id”,但没有起作用。 Web驱动程序 我得到错误“no such element:Unable to locate element:”。如何定位“添加到购物车”对象?

  • 问题内容: 在命令提示符下运行项目时,出现以下错误 我收到以下错误 来源:com / javavids / jaxb / sitemap / UPM / Test.java 来源:com / javavids / jaxb / sitemap / UPM / ObjectFactory.java 来源:com / javavids / jaxb / sitemap / main / Main.ja

  • 执行以下命令时, gst-launch-1.0 filesrc location=野生动物。wmv!decodebin!队列ffmpegcolorspace!自动视频接收器12月!队列音频转换!音频重采样!自动音频接收器 I获取错误如下。 这里有什么问题?

  • 目前,我正在与Selenium合作,尝试使用Chrome中的“Inspect”正确识别元素。在某些情况下,我单击的某些按钮仅由类定义,但使用“”驱动程序无法找到某些类。find_element_by_class_name''。 下面是我从Chrome上用Inspect获得的代码的和平: 我需要单击“导入费用”按钮,该按钮是“x-btn文本menu_import2”类的一部分。我不能在这里使用XPA