【问题标题】:JAXB Wrapper+Adapter Ignoring OutputJAXB Wrapper+Adapter 忽略输出
【发布时间】:2018-06-21 04:51:09
【问题描述】:

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

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

这是 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. 适配器确实尝试转换 PlaceHolder 类
  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);
    }
}

【问题讨论】:

    标签: java xml jaxb unmarshalling


    【解决方案1】:

    超级困惑。

    无论是否指定@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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 2021-05-11
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2012-11-20
      • 2023-03-25
      相关资源
      最近更新 更多