【问题标题】:@XmlJavaTypeAdapter on an abstract class?@XmlJavaTypeAdapter 在抽象类上?
【发布时间】:2014-02-14 11:39:27
【问题描述】:

JAXB 抱怨 X 类“...没有无参数默认构造函数。

在我的例子中,X 类是几十个 auto-generatedfinal 类中的一个,它们确实没有无参数的默认构造函数。它还恰好扩展了一个 abstract 类,如果我愿意,我可以对其进行修改。我想在抽象类上放一个@XmlJavaTypeAdapter 注释,但这不起作用,我不确定它是否有意义。什么是最好的解决方案或解决方法?

编辑:只是为了清楚。我无法修改生成的类。

【问题讨论】:

    标签: java jaxb


    【解决方案1】:

    您可以在抽象超类上添加XmlAdapter(请参阅http://blog.bdoughan.com/2012/01/jaxb-and-inhertiance-using-xmladapter.html)。请务必注意,XmlAdapter 将仅应用于引用该类的映射字段/属性,而不是当该类的实例被编组为根对象时。您也无法将该类包含在传入的类数组中以引导JAXBContext

    【讨论】:

    • 我不确定我是否理解您的回答中的“重要的是要注意...”部分。实际上,我在发布问题之前阅读了您的博客,它要求适配器了解所有实现类。在我的例子中,大约有 50 个类扩展了抽象类,它们可以随时更改。如果我说我希望 JAXB 能够编组任何扩展抽象类的东西,也许我在问不可能......
    【解决方案2】:

    像这样在该类中放置一个无参数构造函数:

    public ClassName(){
    }
    

    【讨论】:

      【解决方案3】:

      通常情况下(由于框架的原因)您需要一个无参数的构造函数。例如,在使用 JAXB 时,它实例化的 bean 需要一个无参数的构造函数。我经常做的是:

      public MyClass(String something) {
          // do something
      }
      
      public MyClass() {
          // for frameworks!
      }
      

      这当然要求您不要将逻辑放在构造函数中,但这几乎总是可能的。

      PS:有些框架实际上有允许@PostConstruct 调用的注解。

      【讨论】:

      • 我知道 JAXB 需要它,但我不能简单地将它自己添加到自动生成的类中。无论如何这都是不可取的,因为这意味着可以在不传入something 的情况下构造该类(以您的答案为例)。虽然我可能会看看是否可以使用私有无参数构造函数生成类 - 这是一种解决方法,但我希望 JAXB 可以自己提供一些东西。
      • 如果您不能创建无参数构造函数,那么我不确定是否可以使用 JAXB,您将如何准确地告诉它使用哪个构造函数以及为每个实例传递哪些参数?也许有必要从根本上重新考虑设计,因为这看起来很奇怪?
      • 这确实是一个奇怪且不方便的情况。但有时不幸的是,必须使用无法轻易更改、您可能无法访问或重构成本太高的遗留代码......这确实是一个知道一两个技巧的 JAXB 专家的问题...... .
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多