当前位置: 首页 > 面试题库 >

JAXB和抽象类

漆雕奇逸
2023-03-14
问题内容

我正在尝试使用JAXB解组一些XML,但出现“无法创建…的实例”异常。我知道为什么-
它试图建立一个抽象类的实例。我想要的是让它成为特定实现类的实例。我的目标是对setter方法进行特定于类的检查。对于BarImpl,也许“
qux”是有效的baz值,但BarImpl2想要做其他事情。

我没有通过注释Foo来实现这一目标,但是如果我不注释bar,事情就会变得很丑。

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.junit.Test;


public class JAXBTest {

    @Test
    public void test() throws javax.xml.bind.JAXBException {
        String xml = 
            "<foo>" +
            "  <bar>" +
            "    <baz>qux</baz>" +
            "  </bar>" +
            "</foo>";

        javax.xml.bind.JAXBContext context = javax.xml.bind.JAXBContext.newInstance(
                FooImpl.class,
                BarImpl.class
        );

        javax.xml.bind.Unmarshaller unmarshaller = context.createUnmarshaller();

        unmarshaller.unmarshal(new java.io.StringReader(xml));
    }

    @XmlRootElement(name="foo")
    public static abstract class Foo {
        @XmlElement(name="bar")
        Bar bar;
    }

    @XmlRootElement(name="bar")
    public static abstract class Bar {
        @XmlElement(name="baz")
        String baz;
    }

    public static class FooImpl extends Foo { }
    public static class BarImpl extends Bar { }
}

问题答案:

您可以执行以下操作:

  • @XmlRootElement代替抽象类来注释impl 类。
  • 用标记抽象类@XmlTransient(请参见http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html)
  • 用于@XmlElement(type=BarImpl.class)bar属性上指定具体类型(请参见http://blog.bdoughan.com/2011/05/jaxb-and-interface-fronted-models.html)。

JAXB测试

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

import org.junit.Test;


public class JAXBTest {

    @Test
    public void test() throws javax.xml.bind.JAXBException {
        String xml = 
            "<foo>" +
            "  <bar>" +
            "    <baz>qux</baz>" +
            "  </bar>" +
            "</foo>";

        javax.xml.bind.JAXBContext context = javax.xml.bind.JAXBContext.newInstance(
                FooImpl.class,
                BarImpl.class
        );

        javax.xml.bind.Unmarshaller unmarshaller = context.createUnmarshaller();

        unmarshaller.unmarshal(new java.io.StringReader(xml));
    }

    @XmlTransient
    public static abstract class Foo {
        @XmlElements({
            @XmlElement(name="bar",type=BarImpl.class),
            @XmlElement(name="bar",type=BarImpl2.class),
        })
        Bar bar;
    }

    @XmlTransient
    public static abstract class Bar {
        @XmlElement(name="baz")
        String baz;
    }

    @XmlRootElement(name="foo")
    public static class FooImpl extends Foo { }

    @XmlRootElement(name="bar")
    public static class BarImpl extends Bar { }

    public static class BarImpl2 extends Bar { }
}


 类似资料:
  • 好啊我是JAXB新手,我对XmlID和XmlIDREF有一些问题,其中ID位于抽象类中。 我的问题是: 此类包含一个抽象实体,在本例中是一个字符串。 此类包含两个列表,一个列表包含“SomeClass”的实例,另一个列表包含“EntityImpl”的实例 impl被添加到res,res和impl都被添加到根目录上各自的列表中。 我想要的结果是引用SomeClass实体中impl的Id,但结果是:

  • 问题内容: 我有一个包含带有抽象超类的JAXB注释类的程序包。我想在Web服务接口中使用此超类,因此可以将任何子类作为参数传递。当我这样做时,会引发异常: 可以手动将marshall / unmarshall&参数作为字符串传递,但我想避免这种情况。有什么想法怎么做? 问题答案: 您是否在Web服务请求中指定了具体的实现?这对我来说很好: 抽象基类: 实现类: Web服务方法: 请求:

  • 我目前正在尝试使用JaxB,但对于一个相对简单的示例,我并不是很成功。我的示例如下: 我所有的尝试(甚至编组)都失败了。我浏览了BlaiseDoughan的博客,包括http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html但他们似乎对我的例子都没有帮助。我很可能误用了他的例子。在我看来,我的示例应该是JaxB中

  • 我使用JAXB将一些xml解组到一个对象中。 我有一个从抽象类继承的类。我已经将抽象类标记为@XmlTransient。然后使用XMLType PropOrder,我可以访问抽象类中的属性,如下所示: 凉。问题是有时它不是我想访问的元素,而是一个属性。通常,您将使用@XMLAttribute来定义此类属性,以指示值存储在 xml 特性而不是元素中。但是,鉴于我已经在定义了“id”的抽象类上使用了

  • 我想读关于抽象的文章,但读到不同的文章,我感到很困惑。 下面是我无法理解的问题: 1)“抽象是通过使用抽象类和接口实现的吗?”我对此进行了搜索,得到了三种类型的答案: 与此处解释的不同。 它们是相同的,只是不同的观点,就像这里解释的。 最后一个是抽象类用来实现抽象。 哪一个是真的?请举一个简单的例子。 2)“抽象意味着隐藏不必要的细节。比如专注于一个对象做什么而不是它是如何完成的。” 这是正确的吗

  • 是否有任何JAXB绑定可以告诉JAXB代码生成器将Java类生成为,而不必在XSD中将相应的XML类型标记为? 情况如下: > 我在xsd中定义架构: 我使用内联JAXB绑定(“inline”==“直接在模式中”)来指示应该生成JAXB类的包(): 我使用内联JAXB绑定为我的每个复杂类型(在本例中、和)指示实现类的名称: 我从模式生成JAXB类。这导致: 我自己编写类: 使用这两个类层次结构这样