2015-12-07 14 views
2

Я пытаюсь реализовать наследование с аннотацией @XmlSeeAlso. Все работает так, как ожидалось, при использовании разных имен корневых узлов для подклассов. Но при тех же корневых именах Unmarshaller всегда выбирает последний класс из списка XmlSeeAlso, несмотря на содержимое. Невозможно изменить имена корней. Есть ли способ заставить Unmarshaller правильно выбирать класс по содержанию?@XmlSeeAlso не работает для одного корневого узла

import java.io.ByteArrayInputStream; 

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlSeeAlso; 
import javax.xml.transform.stream.StreamSource; 

import org.springframework.oxm.jaxb.Jaxb2Marshaller; 

public class Test { 
    public static void main(String[] args) { 
    Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller(); 
    unmarshaller.setClassesToBeBound(Parent.class); 
    System.out.println(unmarshaller.unmarshal(new StreamSource(
     new ByteArrayInputStream("<value><a>AAA</a><b>BBB</b></value>" 
      .getBytes())))); 
    System.out.println(unmarshaller.unmarshal(new StreamSource(
     new ByteArrayInputStream("<value><c>CCC</c><d>DDD</d></value>" 
      .getBytes())))); 
    } 

    @XmlSeeAlso({ ChildAB.class, ChildCD.class }) 
    public static abstract class Parent { 
    } 

    @XmlRootElement(name = "value") 
    public static class ChildAB { 
    @XmlElement(name = "a") 
    private String a; 
    @XmlElement(name = "b") 
    private String b; 

    @Override 
    public String toString() { 
     return "ChildAB[" + a + "; " + b + "]"; 
    } 
    } 

    @XmlRootElement(name = "value") 
    public static class ChildCD { 
    @XmlElement(name = "c") 
    private String c; 
    @XmlElement(name = "d") 
    private String d; 

    @Override 
    public String toString() { 
     return "ChildCD[" + c + "; " + d + "]"; 
    } 
    } 
} 

Выход:

ChildCD[null; null] 
ChildCD[CCC; DDD] 

ответ

0

Почему ваш класс ChildAB и ChildCD являются статическими? Также ChildAB и ChildCD должны внедрять/продлевать ваш родительский класс.

+0

Занятия ChildAB и ChildCD являются внутренними ради краткости. Если они не были статическими, их невозможно было бы использовать для разборки, поскольку они не могли быть созданы без включения экземпляра класса. Вы правы, они должны расширять родительский класс, хотя он не имеет значения в контексте проблемы. SeeAlso аннотация ничего не делает с наследованием – Tanya