JAXB 包装器+适配器忽略输出



所以我有一个奇怪的问题。我包装了一个XML元素,需要解析该元素然后将其转换为其他类型。

我想如果我使用 @XmlElement(type=PlaceHolder.class(,我可以让 JAXB 将所有需要的信息解析到占位符中,然后使用 @XmlJavaTypeAdapter 将占位符转换为我需要的类。

这是来自 System.out 的输出

||tree.log, 1  tree.log
tree.log x 1/2
||test.oo, 2  null
||craft.lumber, 2  null
wb.lumber Lumber 10.0 | 0 -> 0

这让我相信

  1. XML 被解析为 PlaceHolder 类(XMLItemStack(
  2. 适配器尝试转换占位符类
  3. 适配器的输出将被忽略。

.XML

<recipe id="wb.lumber">
<name>Lumber</name>
<time>10</time>
<building>workbench</building>
<in>
<item id="tree.log">
<stack>1</stack>
</item>
<item id="test.oo">
<stack>2</stack>
</item>
</in>
<out>
<item id="craft.lumber">
<stack>2</stack>
</item>
</out>
</recipe>

主类

@XmlRootElement
public class Recipe {
@XmlAttribute
@XmlID
String id;
@XmlElement
String name;
@XmlElement
float time;
@XmlElementWrapper(name="in")
@XmlElement(name="item",type=XMLItemStack.class)
@XmlJavaTypeAdapter(xmlToItemStackAdapter.class)
ItemStack[] req;
@XmlElementWrapper(name="out")
@XmlElement(name="item",type=XMLItemStack.class)
@XmlJavaTypeAdapter(xmlToItemStackAdapter.class)
ItemStack[] res;
@Override
public String toString(){
String str = id+" "+name+" "+time+" | "+(req == null ? 0 : req.length)+" -> "+(res == null ? 0 : res.length);
return str;
}
}

适配器和占位符类

@XmlRootElement(name="item")
static class XMLItemStack {
@XmlAttribute
@XmlID
String id;
@XmlElement
int stack;
@Override
public String toString(){
return id+" "+stack;
}
public XMLItemStack(){}
public XMLItemStack(String name,int size){
id = name;
stack = size;
}
}
static class xmlToItemStackAdapter extends XmlAdapter<XMLItemStack,ItemStack> {
@Override
public XMLItemStack marshal(ItemStack v) throws Exception {
return new XMLItemStack(v.getItem().getID(),v.getCount());
}
@Override
public ItemStack unmarshal(XMLItemStack v) throws Exception {
Item it = Items.getItem(v.id);
System.out.println("||"+v.id+", "+v.stack+"  "+it);
if(it == null){
throw new Exception("Unable to Find Item for Crafting Recipe");
}
System.out.println(new ItemStack(it,v.stack));
return new ItemStack(it,v.stack);
}
}

超级困惑。

无论是否指定@XmlElement类型,将 ItemStack[] 更改为数组列表都可以解决问题。

@XmlRootElement
public class Recipe {
@XmlAttribute
@XmlID
String id;
@XmlElement
String name;
@XmlElement
float time;
@XmlElementWrapper(name="in")
@XmlJavaTypeAdapter(xmlToItemStackAdapter.class)
@XmlElement(name="item",type=XMLItemStack.class)
ArrayList<ItemStack> req;
@XmlElementWrapper(name="out")
@XmlJavaTypeAdapter(xmlToItemStackAdapter.class)
@XmlElement(name="item")
ArrayList<ItemStack> res;
@Override
public String toString(){
String str = id+" "+name+" "+time+" | "+(req == null ? 0 : req.size())+" -> "+(res == null ? 0 : res.size());
return str;
}
}

最新更新