我尝试使用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
再次感谢
答案 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(即包装在一个命名元素中)