gpt4 book ai didi

java - JAXB 从 java 生成 nillable = "true"

转载 作者:行者123 更新时间:2023-11-29 07:52:31 24 4
gpt4 key购买 nike

这是一个错误吗?

我的 xsd 架构中需要 nillable = "true"。从我的 java 代码生成这样一个元素的唯一方法是使用 @XmlElement(nillable = true),对吗?但在这种情况下,我将无法利用这个定义,我将无法检查该元素是否设置为 nilisNil() 方法位于 JAXBElement 包装器类中。

那么,我在这里有什么选择 - 我想在我的 xsd 模式中生成 nillable = "true" 并能够检查它是否是从我的 java 代码中设置的。

最佳答案

I need nillable = "true" in my xsd schema. The only way to generate such an element from my java code is to use @XmlElement(nillable = true), right?

是的。

But in this case, I will not be able to take advantage of this definition, I will not be able to check if the element is set to nil. The method isNil() is in the JAXBElement wrapper class.

您可以执行 getFoo() == null 来确定它是否为 null。如果您试图确定 null 是否对应于不存在的元素或 xsi:nil="true",那么您将不得不做更多的事情。不会为缺少的节点完成设置,因此您可以在 setter 中放置逻辑以跟踪是否由于具有 xsi:nil="true 的元素而完成设置为 null。

@XmlElement(nillable=true)
public String getFooString() {
return fooString;
}

public void setFooString(String foo) {
this.fooString = foo;
this.setFoo = true;
}

如果您不想拥有这种额外的逻辑(无论如何这对编码没有帮助,您需要利用 JAXBElement

@XmlElementRef(name="fooJAXBElement")
public JAXBElement<String> getFooJAXBElement() {
return fooJAXBElement;
}

public void setFooJAXBElement(JAXBElement<String> fooJAXBElement) {
this.fooJAXBElement = fooJAXBElement;
}

Java 模型

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlType(propOrder={"fooString", "barString", "fooJAXBElement", "barJAXBElement"})
public class Root {

private String fooString;
private String barString;
private JAXBElement<String> fooJAXBElement;
private JAXBElement<String> barJAXBElement;

private boolean setFoo;
private boolean setBar;

@XmlElement(nillable=true)
public String getFooString() {
return fooString;
}

public void setFooString(String foo) {
this.fooString = foo;
this.setFoo = true;
}

public boolean isSetFooString() {
return setFoo;
}

@XmlElement(nillable=true)
public String getBarString() {
return barString;
}

public void setBarString(String bar) {
this.barString = bar;
this.setBar = true;
}

public boolean isSetBarString() {
return setBar;
}

@XmlElementRef(name="fooJAXBElement")
public JAXBElement<String> getFooJAXBElement() {
return fooJAXBElement;
}

public void setFooJAXBElement(JAXBElement<String> fooJAXBElement) {
this.fooJAXBElement = fooJAXBElement;
}

@XmlElementRef(name="barJAXBElement")
public JAXBElement<String> getBarJAXBElement() {
return barJAXBElement;
}

public void setBarJAXBElement(JAXBElement<String> barJAXBElement) {
this.barJAXBElement = barJAXBElement;
}

}

对象工厂

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRegistry
public class ObjectFactory {

@XmlElementDecl(name="fooJAXBElement")
public JAXBElement<String> createFooJAXBElement(String string) {
return new JAXBElement<String>(new QName("fooJAXBElement"), String.class, string);
}

@XmlElementDecl(name="barJAXBElement")
public JAXBElement<String> createBarJAXBElement(String string) {
return new JAXBElement<String>(new QName("barJAXBElement"), String.class, string);
}

}

演示

下面是一个完整的例子来演示上面讨论的概念。

输入.xml

此文档包含 2 个明确标记为 xsi:nil="true" 的元素和 2 个不存在的其他映射元素。

<?xml version="1.0" encoding="UTF-8"?>
<root>
<barString xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
<barJAXBElement xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
</root>

演示

此演示代码将读取上述 XML 并检查属性是否已设置为解码的结果。

import java.io.File;
import javax.xml.bind.*;

public class Demo {

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

Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum20076018/input.xml");
Root root = (Root) unmarshaller.unmarshal(xml);

System.out.println("Was fooString set? " + root.isSetFooString());
System.out.println("Was barString set? " + root.isSetBarString());
System.out.println("Was fooJAXBElement set? " + (root.getFooJAXBElement() != null));
System.out.println("Was barJAXBElement set? " + (root.getBarJAXBElement() != null));

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

}

输出

下面是运行演示代码的输出。我们看到所有 is set 检查都是正确的,但输出仅完全匹配 JAXBElement 属性的输入。

Was fooString set?  false
Was barString set? true
Was fooJAXBElement set? false
Was barJAXBElement set? true
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<fooString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<barString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
<barJAXBElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</root>

关于java - JAXB 从 java 生成 nillable = "true",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20076018/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com