【问题标题】:JaxB UNMarshalling ProblemJaxB 解组问题
【发布时间】:2025-12-30 04:10:06
【问题描述】:

我尝试在以下线程中运行相同的示例:

JAXB Annotations - Mapping interfaces and @XmlElementWrapper

但我收到以下异常:

意外元素(uri:“”,本地:“狗”)。预期的元素是 奇怪的问号符号}>catchAll>

...

知道为什么我会收到此异常吗?

【问题讨论】:

    标签: jaxb


    【解决方案1】:

    我设法运行了这个例子,但是在使用带有 java.uill.List 的 XmlElements 标记之后 代码如下:

    @XmlRootElement class Zoo {

    @XmlElements({
            @XmlElement(name = "Dog" , type = Dog.class),
            @XmlElement(name = "Cat" , type = Cat.class)
    })
    private List<Animal> animals;
    
    public static void main(String[] args) throws Exception {
        Zoo zoo = new Zoo();
        zoo.animals = new ArrayList<Animal>();
    
        Dog doggy = new Dog();
        doggy.setDogProp("Doggy");
    
        Cat catty = new Cat();
        catty.setCatProp("Catty");
    
        zoo.animals.add(doggy);
        zoo.animals.add(catty);
    
        JAXBContext jc = JAXBContext.newInstance(Zoo.class, Dog.class, Cat.class);
        Marshaller marshaller = jc.createMarshaller();
    
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        marshaller.marshal(zoo, os);
    
        System.out.println(os.toString());
    
        Unmarshaller unmarshaller = jc.createUnmarshaller();
    
        unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());
    
        Zoo unmarshalledZoo = (Zoo) unmarshaller.unmarshal(new ByteArrayInputStream(os.toByteArray()));
    
        if (unmarshalledZoo.animals == null) {
            System.out.println("animals was null");
        } else if (unmarshalledZoo.animals.size() == 2) {
            System.out.println("it worked");
        } else {
            System.out.println("failed!");
        }
    }
    
    public interface Animal {
    }
    
    @XmlRootElement
    public static class Dog implements Animal {
    
        private String dogProp;
    
        public String getDogProp() {
            return dogProp;
        }
    
        public void setDogProp(String dogProp) {
            this.dogProp = dogProp;
        }
    }
    
    @XmlRootElement
    public static class Cat implements Animal {
    
        private String catProp;
    
        public String getCatProp() {
            return catProp;
        }
    
        public void setCatProp(String catProp) {
            this.catProp = catProp;
        }
    }
    

    }

    【讨论】: