我正面临一个问题,我希望有人可以帮助我。 我有一个模型项目,其中包含很多pojos,还有一些枚举。
我有一个通用的地图,它包含键和值,可以是任何类型。 地图看起来像这样:
@XmlRootElement
public class Foo implements Serializable
Map<Object,Object> myMap
地图可以容纳的一个值是枚举。 既然我想让jaxb编组/解组它,我正在尝试创建像
这样的东西@XmlEnum(value=org.yyy.models.enum.FooEnum)
public class MyEnum
枚举类是一个简单的枚举:
public enum FooEnum{
ONE,TWO,THREE
}
由于我不想使用@XmlEnumValue复制枚举的值,我想知道如何添加该依赖项。再次,无需维护两组值(一个在枚举中,一个在我的jaxb枚举中)。
在我看到的所有示例中,它非常简单,因为通常该类拥有某种类型的成员,在我的情况下,因为地图可以包含任何值,我不能对其添加任何限制。
我的问题是jaxb unmarshall,似乎它无法将我的测试中的值转换为枚举值 - 它不会抛出异常,unmarshalled值为null
这是一个例子:
<table>
<entry>
<key xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Name</key>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Test</value>
</entry>
<entry>
<key xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Type</key>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="myEnum">ONE</value>
</entry>
</table>
答案 0 :(得分:1)
看起来你几乎一切都正确,但你的问题是上下文可能不知道如何处理你定义的枚举类。
我能够构建一小组类来生成所需的输出,而无需任何特殊的枚举注释。
编辑:因此,在进一步评估与解组相关的问题后,我修改了测试以尝试解析您的问题描述中粘贴的XML(包含<Foo></Foo>
标记)并将获取的对象重新编组到System.out以验证一切正常。
我创建了一个名为“MyXml.xml”的文件,其中包含以下内容(来自上面):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo>
<table>
<entry>
<key xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Name</key>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Test</value>
</entry>
<entry>
<key xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Type</key>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="myEnum">ONE</value>
</entry>
</table>
</Foo>
然后,使用注释如此的Foo类:
@XmlRootElement(name = "Foo")
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo implements Serializable {
private static final long serialVersionUID = 1L;
public Foo() {}
// wrap your map in a table tag
@XmlElementWrapper(name = "table")
// the entry will be the tag used to enclose the key,value pairs
@XmlElement(name="entry")
Map<Object, Object> myMap = new HashMap<Object, Object>();
public Map<Object,Object> getMyMap() {
return myMap;
}
}
简单的枚举类,不需要注释:
public enum MyEnum {
ONE, TWO, THREE;
}
这个测试:
public class Test {
public static void main(String[] args) throws Exception {
// create your context, and make sure to tell it about your enum class
JAXBContext context = JAXBContext.newInstance(new Class[]{Foo.class,MyEnum.class});
// create the unmarshaller
Unmarshaller unmarshaller = context.createUnmarshaller();
// try to unmarshal the XML into a Foo object
Foo f = (Foo) unmarshaller.unmarshal(new File("MyXml.xml"));
// if it worked, try to write it back out to System.out and verify everything worked!
if ( f != null) {
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(f, System.out);
}
}
}
产生以下输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Foo>
<table>
<entry>
<key xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Type</key>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="myEnum">ONE</value>
</entry>
<entry>
<key xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Name</key>
<value xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Test</value>
</entry>
</table>
</Foo>
如您所见,不需要额外的Enum管理,并且观察到正确的输出。 希望这会有所帮助。