2016-05-05 3 views
1

Я новичок в JAXB (и с Stackoverflow тоже!), И я столкнулся с проблемами при попытке маршалировать и развязать объект, содержащий список перечислений, реализующих интерфейс. Я посмотрел here и я попробовал подобный пример:Интерфейс реализации JAXB и enum

public class testXML { 
    private static interface Animal { 
     public String getName(); 
    } 

    @XmlRootElement 
    private static class Lion implements Animal { 
     @XmlElement 
     private String name; 
     public Lion() { name = "Lion"; } 
     @Override public String getName() { 
      return name; 
     } 
    } 

    @XmlRootElement 
    private static class Dog implements Animal { 
     @XmlElement 
     private String name; 
     public Dog() { name = "Dog"; } 
     @Override public String getName() { 
      return name; 
     } 
    } 

    @XmlRootElement 
    private static class Zoo { 
     @XmlElementRefs({ 
      @XmlElementRef(name = "lion", type = Lion.class, required = true), 
      @XmlElementRef(name = "dog", type = Dog.class, required = true) 
     }) 
     public List<Animal> animals; 
     public Zoo(Animal ... animals) { 
      this.animals = Arrays.asList(animals); 
     } 
     public Zoo() { 
      animals = null; 
     } 
     public Animal getAnimal(int i) { 
      return animals.get(i); 
     } 
    } 

    public static void main(String[] args) throws JAXBException { 
     File file = new File("testXML.xml"); 
     JAXBContext context = JAXBContext.newInstance(
       Zoo.class, 
       Lion.class, 
       Dog.class); 
     //SerializableParameter<ChannelParamEnum> result = new SerializableParameter(ChannelParamEnum.PARAM_CH_FGAIN, 1.0); 
     Zoo result = new Zoo(new Lion(), new Dog()); 
     Marshaller marshaller = context.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     marshaller.marshal(result, file); 

     Zoo unmar = (Zoo)context.createUnmarshaller().unmarshal(file); 
     Animal anim = unmar.getAnimal(0); 
     System.out.println(anim); 
    } 
} 

Это работало без проблем. Затем я попытался переключиться лев и собака классов в перечислениях и попытался следующее:

public class testXML { 
    private static interface Animal { 
     public String getName(); 
    } 

    @XmlRootElement 
    private static enum Lion implements Animal { 
     SIMBA("Simba"), 
     MUFASA("Mufasa"), 
     SCAR("Scar"); 

     private String name; 
     Lion(String name) { this.name = name; } 
     @Override public String getName() { 
      return name; 
     } 
    } 

    @XmlRootElement 
    private static enum Dog implements Animal { 
     PONGO("Pongo"), 
     PEGGY("Peggy"); 

     private String name; 
     Dog(String name) { this.name = name; } 
     @Override public String getName() { 
      return name; 
     } 
    } 

    @XmlRootElement 
    private static class Zoo { 
     @XmlElementRefs({ 
      @XmlElementRef(name = "lion", type = Lion.class), 
      @XmlElementRef(name = "dog", type = Dog.class) 
     }) 
     public List<Animal> animals; 
     public Zoo(Animal ... animals) { 
      this.animals = Arrays.asList(animals); 
     } 
     public Zoo() { 
      animals = null; 
     } 
     public Animal getAnimal(int i) { 
      return animals.get(i); 
     } 
    } 

    public static void main(String[] args) throws JAXBException { 
     File file = new File("testXML.xml"); 
     JAXBContext context = JAXBContext.newInstance(
       Lion.class, 
       Dog.class, 
       Zoo.class); 
     Zoo result = new Zoo(Lion.SIMBA, Lion.SCAR, Dog.PONGO); 
     Marshaller marshaller = context.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
     marshaller.marshal(result, file); 

     Zoo unmar = (Zoo)context.createUnmarshaller().unmarshal(file); 
     Animal anim = unmar.getAnimal(0); 
     System.out.println(anim); 
    } 
} 

Этот код не удается во время выполнения в JAXBContext.newInstance с

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions 
Invalid @XmlElementRef : Type "package.testXML$Lion" or any of its subclasses are not known to this context. 

Очевидно, что это не мой вариант использования, и Я должен использовать перечисления вместо классов. Я много огляделся, но ответа не нашел, поэтому любая помощь очень ценится.

Спасибо!

+0

Я столкнулся с той же проблемой. Помимо принятого ответа, есть ли другое решение, которое вы пытались? –

ответ

1

Наконец-то я нашел решение. Этого было достаточно, чтобы изменить

@XmlElementRefs({ 
     @XmlElementRef(name = "lion", type = Lion.class), 
     @XmlElementRef(name = "dog", type = Dog.class) 
    }) 

с

@XmlElements({ 
     @XmlElement(name="lion", type=Lion.class), 
     @XmlElement(name="dog", type=Dog.class) 
    }) 

Во всяком случае, я все еще чувствую, что я пропускаю много, что касается использования JAXB.

Я надеюсь, что эта помощь!