在JAXB生成类时,如何向根元素添加属性?

时间:2014-10-17 18:17:08

标签: spring-mvc jaxb maven-jaxb2-plugin

我正在开发一个使用Spring MVC的REST API。我消耗和生成的对象是从NCPDP(http://www.ncpdp.org/)XSD生成的(使用JAXB)。当请求进入时,我已经完成了所有工作,但是我想在传出请求的根元素上添加其他属性。

现在,我的传出回复如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<transport:Message xmlns:transport="http://www.ncpdp.org/schema/transport">
    <transport:Header>
        ...
    </transport:Header>
    <transport:Body>
        <transport:Status>
            <transport:Code>010</transport:Code>
            <transport:Description>OK</transport:Description>
        </transport:Status>
    </transport:Body>
</transport:Message>

它应该如下所示:

<?xml version="1.0"?>
<transport:Message xmlns:transport="http://www.ncpdp.org/schema/transport" xmlns:datatypes="http://www.ncpdp.org/schema/datatypes" 
    xmlns:script="http://www.ncpdp.org/schema/script" xmlns:structures="http://www.ncpdp.org/schema/structures" 
    xmlns:pa-structures="http://www.ncpdp.org/schema/pa-structures" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    StructuresVersion="v2014041" ECLVersion="v2014041" DatatypesVersion="v2014041" PA-StructuresVersion="v2014041" 
    TransactionVersion="v2014041" TransportVersion="v2014041" TransactionDomain="SCRIPT">
  <transport:Header>
    ...
  </transport:Header>
  <transport:Body>
    <transport:Status>
      <transport:Code>010</transport:Code>
    </transport:Status>
  </transport:Body>
</transport:Message>

我不相信我需要定义所有名称空间(因为它们没有被使用),但我确实需要StructuresVersion和所有其他属性。有没有办法修改我的bindings.xjb以包含这些属性?或者我是否必须将生成的代码复制到源代码树中并添加注释才能执行此操作?

谢谢,

马特

1 个答案:

答案 0 :(得分:2)

由于这些属性是在XML模式中声明的,因此您应该在模式派生代码中获取适当的属性。

如果这是根元素或某个子元素,实际上并不重要。请重新检查生成的代码,查找getStructuresVersion()之类的内容。所以你不需要做任何事情。

对于命名空间,当你编组时,你将自动声明它们。但是你可能首先将它们声明为ns0ns1等,这在可读性方面并不是很好。请参阅以下问题:

Controlling namespace prefixes in JAXB

(问题本身,而不是答案)有关如何使用自定义前缀映射器或Blaise Doughan的this post来控制这些前缀的信息。