【问题标题】:Adding behaviour to JAXB generated class向 JAXB 生成的类添加行为
【发布时间】:2011-02-12 20:54:19
【问题描述】:

我必须在我的 jaxb 生成的类中添加一点业务逻辑。例如,我有以下 XML:

<vehicle>
 <car id="20" make="ABC"/>
</vehicle>

<vehicle>
 <motorcycle id="05" make="XYZ"/>
<vehicle>

<vehicle>
 <truck id="34"  make="UVW"/>
</vehicle>

我为这些生成 XSD。

现在我必须实现的是在解组这些类型的任何 XML 期间(即每当调用汽车、摩托车或卡车的设置器时,它还应该设置我不想添加为属性的车辆类型在 XML 中)。

或者在解组之后(我可以知道子元素的 QName 的任何方式)。 我试过How can I extend Java code generated by JAXP-cxf or Hibernate tools?,但从未调用过覆盖的设置器。

【问题讨论】:

    标签: java jaxb


    【解决方案1】:

    JAXB 有一个“后构造”工具(请参阅javadoc)。只需在带注释的类中添加类似的内容:

    void afterUnmarshal(Unmarshaller, Object parent) {
        vehicle.setType(..); // your logic here    
    }
    

    【讨论】:

    • 现在,在我解组 XML 后,我收到了一个车辆对象,其中我有汽车、摩托车或卡车类型的对象。如何知道其中存在哪些?
    • 我也想到了,但没有添加,因为他说“JAXB生成的类”,所以我假设他的类是在每次构建时生成的。但它可能是“生成一次”
    【解决方案2】:

    您可以创建一个JAXB extension。但这对我来说听起来像是一种开销——只要你解组一个 JAXB 对象,你就可以简单地调用一个初始化程序。比如:

    public class Initializer {
        public static void initialize(Vehicle vehicle) {
           vehicle.setType(..); // your logic here
        }
    }
    

    并致电Initializer.initialize(unmarshalledObject)

    【讨论】:

    • 调用什么类型的初始化器,JAXB 支持吗?
    • 我的意思是,外部初始化器。
    • 你能提供一个示例代码吗,实际上我是新手。提前谢谢
    • 但是 Bozho,我如何从 unmarshalledObject 中知道我在车辆对象中拥有哪种车辆类型。实际上,问题可以表述为如何知道未编组的车辆对象中存在哪些子类型(汽车、卡车或摩托车)。
    猜你喜欢
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多