使用子元素的JAXB注释

时间:2011-09-16 15:08:32

标签: java xml jaxb

我正在编组和解组消息。 我有这样的XML类型:

@XMLAccesorType(AccesorType.FIELD)
@XMLType(name="Header")
public class Header{

@XMLElement(name="messageId")
private String messageId;
//getters and setters
}

我有消息类型:

<Message>
<messageId>1111</messageId>
</Message>

我想将MessageId类型分配给独立类,因为我在不同的消息中使用了很多时间:

@XMLAccesorType(AccesorType.FIELD)
@XMLType(name="MessageIdType")
public class MessageIdClass{

@XMLElement(name="messageId")
private String messageId;
//getters and setters
}

但是后来我有了包含MessageId的不需要的标签。 我想要:

<Message>
   <MessageId>1111</MessageId>
</Message>

但得到了:

<Message>
   <MessageIdType>
      <MessageId>1111</MessageId>
   </MessageIdType>
</Message>

此外,Messages不能使用messageId字段继承某些基类。 我能写这样的东西吗?:

//inside Message
@SomeAnnotation(useOnlyChildFields=true)
MessageIdClass msgId;

2 个答案:

答案 0 :(得分:3)

你可以这样做:

@XmlType(name="MessageIdType")
public class MessageIdClass{
    @XmlValue
    private String messageId;
}

这将创建一个简单的类型。

如果您需要多个属性,或者您需要的一个属性无法映射到简单类型,您仍然可以创建具有多个属性的类型,然后使用:

new JAXBElement<MessageIdClass>(
    new QName("http://foo/bar", "ElementOfThisType"),
    MessageIdClass.class,
    null,
    object_of_type_MessageIdClass);

创建此类型的元素。这通常在ObjectFactory中完成,其方法是接收MessageIdClass对象,并使用@XmlElementDecl进行注释。

答案 1 :(得分:1)

我相信@XmlValue正是您所寻找的,这将消除messageId元素:

@XmlAccesorType(XmlAccesorType.FIELD)
@XmlType(name="MessageIdType")
public class MessageIdClass{

    @XmlValue
    private String messageId;
    //getters and setters
}

了解更多信息