【发布时间】:2016-08-03 12:12:47
【问题描述】:
我正在尝试使用 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());
这就是编组的 bean 的样子
<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 将 name 属性放入 @XmlRootElement 而不是 @XmlType ?
再次感谢
【问题讨论】:
标签: java xml serialization jaxb annotations