java - JAXB和enum实现接口(interface)

标签 java jaxb2

我是 JAXB 新手(也是 Stackoverflow!),在尝试编码和解码包含实现接口(interface)的枚举列表的对象时遇到了问题。 我看了here我尝试了一个类似的例子:

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);
    }
}

这工作没有问题。然后,我尝试将 Lion 和 Dog 类切换为枚举,并尝试了以下操作:

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.

显然这不是我的用例,我必须使用枚举而不是类。我环顾四周,但没有找到答案,因此非常感谢任何帮助。

谢谢!

最佳答案

终于找到解决办法了。改变就足够了

  @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 的利用方面我错过了很多。

希望对您有所帮助!

关于java - JAXB和enum实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37047690/

相关文章:

java - 使用正则表达式,是否可以在同一范围内同时使用 "is"和 "is not"范围定义?

java - 使用 jaxb2 maven 插件跳过 Java 文件中的生成...

java - JAXB 编码器和反编码器

java - 解码时不使用 JAXB 自己的对象工厂

java - 如何将所有数据分块插入数据库

java 位操作 >>> 移位

java - Java 10 是否提供 val 关键字?如果不是,为什么不呢?

java - JAXB 将不需要的 namespace 声明附加到标记

java - JAXB 2.1 为生成的类实现 Comparable<T>

java - 如何使用 boot 2.0 和 Neo4j SDN5 在 Spring 单元测试中配置我自己的 GraphDatabaseService 和 GraphAwareRuntime