在使用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注释是否会导致xsi:type注释的建议解决了这个问题?
只需在泛型类对象(此示例的值)上使用@xmlanyement(lax=true)
而不是使用@xmlement
。
测试通用
您的JAXB(JSR-222)实现将创建每个类的映射(即TestGeneric
),而不是类型(即TestGeneric
@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;
}
}
}
我能够在属性上使用@XmlAnyElement(lax=true),该属性由于泛型参数而导致问题,然后必须在正在封送的实际类上添加@XmlRootElement,声明消失了!好极了
问题内容: 使用JAXB时,我想在使用泛型时从XML元素中删除多余的名称空间/类型。我该怎么办或我做错了什么?我想使用泛型,这样我只需要编写一次代码块。 示例代码: 输出: 问题答案: 通用测试 您的JAXB(JSR-222)实现将为每个类创建映射(即,不是type(即)。因此,它将字段视为type 。这将导致属性,因为JAXB实现正在添加足够的信息才能解组相同的类型。 演示版 下面是您可以使用的
问题内容: 我正在尝试使用JAXB的自省功能来编组和分解所有使用JAXB批注标记的现有域对象。大多数事情都按预期运行,但是要获得一个相当简单的类进行序列化,我会遇到很多麻烦。此类在许多bean上用作@XmlElement,看起来像: 我尝试执行以下操作,但没有成功,JAXB仍然对接口Comparable感到愤怒。 将Range和DoubleRange都用作bean getter的返回类型会产生如下
我正在尝试使用JAXB从遗留系统中解压XML文档。我的xml结构如下所示:
我对JAXB很陌生,在解封一般对象时遇到了麻烦。问题是我需要能够封送和解封任何对象(java.lang.object)。我成功地进行了封送处理,但是当我运行解封处理时,响应中得到的是一个“ElementNSimpl”对象,而不是我自己的对象。 这是涉及的bean: message.java somebean.java jaxb.index的内容: 生成的xml很好()但是在解封后计算“msg.ge
在代码中创建了这些类的实例之后,我调用了传递所需值的setter方法。尽管该方法的参数是Object,但其值最有可能是字符串(我无法控制它是如何定义的)。但是,为了保持一致,我将字符串转换为Object,以便它与方法的参数类型匹配。代码如下所示: 当我对Java对象进行整理时,我会在结果XML中得到以下内容,就在字符串值的前面: 我读过关于方法的参数类型和传递给它的数据类型不匹配的文章。在我的例子
问题内容: 我正在尝试重构M类型确实扩展了任何内容的类和子类集,即使我们知道它必须是某种类型的子类也是如此。该类型已参数化,我希望其参数化类型可用于已经具有M值的子类。 有什么方法可以定义此类,而不必在参数列表中包括冗余的K和V泛型类型。我希望能够使编译器从子类映射到的M中推断出它们。 换句话说,我希望类声明看起来像这样: 从M的定义可以推断出K和V的类型。 问题答案: 问题在于,它们并没有真正地