使用ComplexType名称而不是JAXB类名称注释进行编组

时间:2016-08-03 12:12:47

标签: java xml serialization jaxb annotations

我尝试使用REST WebService,其中请求作为序列化XML对象发送

这是一个例子

https://localhost:9985/fr_FR/api.ReceiveXMLmessage?xmlString=<TDetails_XCC OpeType="SOME_OPERATION"><TeamID>SOME_ID</TeamID></TDetails_XCC>

由此,我创建了以下XSD架构

<complexType name="TDetails_XCC">
    <annotation>
        <appinfo>
            <jaxb:class name="TeamDetailsRequestType"/>
        </appinfo>
        <documentation>Request team details</documentation>
    </annotation>
    <complexContent>
        <extension base="local:SimpleRESTRequestType"/>
    </complexContent>
</complexType>

<complexType name="SimpleRESTRequestType">
    <sequence>
        <element name="TeamID" minOccurs="0" type="long">
            <annotation>
                <appinfo>
                    <jaxb:property name="teamId"/>
                </appinfo>
            </annotation>
        </element>
    </sequence>
    <attribute name="OpeType" type="string" default="some_operation">
        <annotation>
            <appinfo>
                <jaxb:property name="operationType"/>
            </appinfo>
        </annotation>
    </attribute>
</complexType>

这是生成的Java bean

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TDetails_XCC")
@XmlRootElement public class TeamDetailsRequestType
    extends SimpleRESTRequestType
    implements Serializable
    {
    }

这是用于将bean序列化为XML

的代码
  TeamDetailsRequestType request = new TeamDetailsRequestType();
  request.setTeamId(546464L);
  request.setOperationType("SomeOperation");
  StringWriter writer = new StringWriter();
  JAXBContext context = JAXBContext.newInstance("com.mycompany.myproject.message.team");
  Marshaller marshaller = context.createMarshaller();
  marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
  marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
  marshaller.marshal(request, writer);
  System.out.println(writer.toString());

这就是编组豆的样子

<teamDetailsRequestType OpeType="SomeOperation">
    <TeamID>546464</TeamID>
</teamDetailsRequestType>

这就是我希望得到的

<TDetails_XCC OpeType="SomeOperation">
    <TeamID>546464</TeamID>
</TDetails_XCC>

我设法通过使用QName类

来使其工作
JAXBElement jx = new JAXBElement(new QName("TDetails_XCC"), request.getClass(), request);
marshaller.marshal(jx, System.out);

但我想知道的是,是否可以仅通过XSD架构实现这一目标?

感谢您的时间

更新

我猜测问题来自生成的bean,因为问题是通过以下bean解决的

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType
@XmlRootElement(name = "TDetails_XCC")
public class TeamDetailsRequestType
    extends SimpleRESTRequestType
    implements Serializable
    {
    }

那么,如何更改我的XSD以使JAXB将 名称 属性放在 @XmlRootElement 中,而不是 @XmlType

再次感谢

1 个答案:

答案 0 :(得分:0)

这是解决方案

<element name="TDetails_XCC">
    <annotation>
        <appinfo>
            <jaxb:class name="TeamDetailsRequestType"/>
        </appinfo>
        <documentation>Request team details</documentation>
    </annotation>
    <complexType>
        <complexContent>
            <extension base="local:SimpleRESTRequestType"/>
        </complexContent>
    </complexType>
</element>

this StackOverflow thread中所述,为ComplexType生成 @XmlRootElement 注释的众多解决方案之一是将其声明为匿名 ComplexType(即包装在一个命名元素中)