【问题标题】:JAXB Annotation for using child Elements使用子元素的 JAXB 注释
【发布时间】:2011-09-16 15:08:32
【问题描述】:

我负责编组和解组消息。 我有这样的 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>

消息也不能继承一些带有 messageId 字段的基类。 我可以这样写吗?:

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

【问题讨论】:

  • 你能解释一下But then I have unwanted tag that wrap MessageId.吗?

标签: java xml jaxb


【解决方案1】:

你可以这样做:

@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 进行注释。

【讨论】:

    【解决方案2】:

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

    @XmlAccesorType(XmlAccesorType.FIELD)
    @XmlType(name="MessageIdType")
    public class MessageIdClass{
    
        @XmlValue
        private String messageId;
        //getters and setters
    }
    

    更多信息

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2011-06-20
      • 1970-01-01
      相关资源
      最近更新 更多