从JAXB泛型中删除xsi:type,xmlns:xs和xmlns:xsi

使用JAXB时,我想在使用泛型时从XML元素中删除多余的名称空间/类型。我该怎么办或我做错了什么?我想使用泛型,这样我只需要编写一次代码块。

示例代码:

public static void main(String[] args) {

try {

TestRoot root = new TestRoot();

root.name.value = "bobby";

root.age.value = 102;

root.color.value = "blue";

JAXBContext context = JAXBContext.newInstance(root.getClass());

Marshaller marsh = context.createMarshaller();

marsh.setProperty(Marshaller.JAXB_ENCODING,"UTF-8");

marsh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);

StringWriter sw = new StringWriter();

PrintWriter pw = new PrintWriter(sw);

marsh.marshal(root,pw);

System.out.println(sw.toString());

}

catch(Throwable t) {

t.printStackTrace();

}

}

@XmlRootElement

static class TestRoot {

@XmlElement public TestGeneric<String> name = new TestGeneric<String>(true);

@XmlElement public TestGeneric<Integer> age = new TestGeneric<Integer>(true);

@XmlElement public TestWhatIWouldLike color = new TestWhatIWouldLike(true);

}

@XmlAccessorType(XmlAccessType.NONE)

static class TestGeneric<T> {

@XmlAttribute public boolean isRequired;

@XmlElement public T value;

public TestGeneric() {

}

public TestGeneric(boolean isRequired) {

this.isRequired = isRequired;

}

}

@XmlAccessorType(XmlAccessType.NONE)

static class TestWhatIWouldLike {

@XmlAttribute public boolean isRequired;

@XmlElement public String value;

public TestWhatIWouldLike() {

}

public TestWhatIWouldLike(boolean isRequired) {

this.isRequired = isRequired;

}

}

输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<testRoot>

<name isRequired="true">

<value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">bobby</value>

</name>

<age isRequired="true">

<value xsi:type="xs:int" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">102</value>

</age>

<color isRequired="true">

<value>blue</value>

</color>

</testRoot>

回答:

您的JAXB(JSR-222)实现将为每个类创建映射(即TestGeneric,不是type(即TestGeneric<Integer>)。因此,它将value字段视为type

Object。这将导致xsi:type属性,因为JAXB实现正在添加足够的信息才能解组相同的类型。

@XmlAccessorType(XmlAccessType.NONE)

static class TestGeneric<T> {

@XmlAttribute public boolean isRequired;

@XmlElement public T value;

public TestGeneric() {

}

public TestGeneric(boolean isRequired) {

this.isRequired = isRequired;

}

}


下面是您可以使用的一种方法。我介绍了的子类TestGeneric来代表不同的可能类型。

package forum11192623;

import java.io.PrintWriter;

import java.io.StringWriter;

import javax.xml.bind.*;

import javax.xml.bind.annotation.*;

public class Demo {

public static void main(String[] args) {

try {

TestRoot root = new TestRoot();

root.name.value = "bobby";

root.age.value = 102;

root.color.value = "blue";

JAXBContext context = JAXBContext.newInstance(root.getClass());

Marshaller marsh = context.createMarshaller();

marsh.setProperty(Marshaller.JAXB_ENCODING,"UTF-8");

marsh.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,Boolean.TRUE);

StringWriter sw = new StringWriter();

PrintWriter pw = new PrintWriter(sw);

marsh.marshal(root,pw);

System.out.println(sw.toString());

}

catch(Throwable t) {

t.printStackTrace();

}

}

@XmlRootElement

static class TestRoot {

@XmlElement public TestString name = new TestString(true);

@XmlElement public TestInteger age = new TestInteger(true);

@XmlElement public TestString color = new TestString(true);

}

@XmlAccessorType(XmlAccessType.NONE)

@XmlTransient

@XmlSeeAlso({TestInteger.class, TestString.class})

static class TestGeneric<T> {

@XmlAttribute

public boolean isRequired;

public T value;

public TestGeneric() {

}

public TestGeneric(boolean isRequired) {

this.isRequired = isRequired;

}

}

static class TestInteger extends TestGeneric<Integer> {

public TestInteger() {

}

public TestInteger(boolean b) {

super(b);

}

@XmlElement

public Integer getValue() {

return value;

}

public void setValue(Integer value) {

this.value = value;

}

}

static class TestString extends TestGeneric<String> {

public TestString() {

}

public TestString(boolean b) {

super(b);

}

@XmlElement

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

}

}

以上是 从JAXB泛型中删除xsi:type,xmlns:xs和xmlns:xsi 的全部内容, 来源链接: utcz.com/qa/431117.html

回到顶部