jaxb unmarshalling与其他类作为属性

时间:2012-01-16 09:47:16

标签: java jaxb

我有这两种模式。 AssetMetadata:

        @XmlRootElement(name="AssetMetadata")
        public class AssetMetadata {

        private AssetMetadataType assetMetadataType;
        private String id;
        private String assetId; 
        ....

AssetMetadataType:

        @XmlRootElement(name = "AssetMetadataType")
        public class AssetMetadataType {

        private String id;
        private String name;
        ....

我像这样使用JaxB unmarshaller。 spring config:

<oxm:jaxb2-marshaller id="marshaller">
    <oxm:class-to-be-bound name="ch.srf.esb.radioimporter.domain.AssetMetadata"/>
    <oxm:class-to-be-bound name="ch.srf.esb.radioimporter.domain.AssetMetadataType"/>
</oxm:jaxb2-marshaller>

Java代码:

@Autowired @Qualifier("marshaller") private Unmarshaller unmarshaller;
...
final InputStream is = new ByteArrayInputStream(xml.getBytes());
this.unmarshaller.unmarshal(new StreamSource(is));

现在,当我发送以下XML时,未设置AssetMetadataType:

<AssetMetadata>
  <AssetMetadataType>
    <id>1</id>
    <name>EPG</name>
  </AssetMetadataType>
  <assetId>39b4864d-931b-40c6-85ad-c45251b97952</assetId>
  <title>title</title>
  <description>description</description>
</AssetMetadata>

我做错了什么?

1 个答案:

答案 0 :(得分:2)

@XmlRootElement只应在根元素上设置。这就是为什么它被称为@XmlRootElement。在其他任何地方都会被忽略。

尝试从@XmlRootElement课程中删除AssetMetadataType,并将AssetMetadata中的媒体资源更改为:

@XmlElement(name="AssetMetadataType")
private AssetMetadataType assetMetadataType;