2013-01-17 50 views
3

如何創建包含容器具有屬性的列表的POJO?創建列表的POJO如何創建包含容器具有屬性的列表的POJO?

通常當你這樣做的方式如下:

爲了表示下面的XML結構:

<folder> 
    <messages> 
     <message> 
      <subject>XXXX</subject> 
      ... 
     </message> 
     <message> 
      <subject>XXXX</subject> 
      ... 
     </message> 
    </messages> 
</folder> 
@XmlRootElement(name = "folder") 
public class Folder { 
    @XmlElement 
    private List<Message> messages; 
    ... 
} 
@XmlRootElement(name = "message") 
public class Message { 
    @XmlElement 
    private String subject; 
    ... 
} 

但是你如何代表一個POJO當消息標籤有屬性時?即

<folder> 
    <messages total="45" start="3"> 
     <message> 
      <subject>XXXX</subject> 
      ... 
     </message> 
     <message> 
      <subject>XXXX</subject> 
      ... 
     </message> 
    </messages> 
</folder> 

你專門創建一個POJO的消息,然後MAP消息的列表與@XmlValue註釋或類似的規定?

感謝您的幫助球員。

+1

哪個JAXB提供您使用? –

+0

我正在使用javax.xml.bind.JAXBContext。我試圖找出是否有maven正在添加的外部依賴項,但我似乎無法找到對jaxb的引用。我會盡力弄清楚並立即回覆你。 – azdragon2

+0

幾乎只有兩個選擇:[JAXB RI](http://jaxb.java.net/)和[EclipseLink MOXy](http://www.eclipse.org/eclipselink/moxy.php)。下面是如何找出你正在使用哪一個:http://stackoverflow.com/questions/8626952/check-my-jaxb-implementation/8626974#8626974 –

回答

2

以下方法可以與任何JAXB(JSR-222)實現中使用。

消息

只需使用標準JAXB(JSR-222)的API,你將需要引入Messages類模型。

import java.util.List; 
import javax.xml.bind.annotation.*; 

public class Messages { 

    @XmlElement(name="message") 
    private List<Message> messages; 

    @XmlAttribute 
    private int start; 

    @XmlAttribute 
    public int getTotal() { 
     if(null == messages) { 
      return 0; 
     } else { 
      return messages.size(); 
     } 
    } 

} 

文件夾

然後,你將需要修改Folder類引用新Messages類。

import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Folder { 

    private Messages messages; 
} 

消息

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Message { 

    private String subject; 

} 
+1

這個應該被接受。 –

+0

這是我工作的正確答案。謝謝你們的幫助。 – azdragon2

1

注:我是EclipseLink JAXB (MOXy)鉛和JAXB (JSR-222)專家組

如果使用莫西爲您的JAXB提供者,那麼你可以充分利用@XmlPath延伸並執行以下操作中的一員。你需要

文件夾

import java.util.List; 
import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Folder { 

    @XmlElementWrapper 
    @XmlElement(name="message") 
    private List<Message> messages; 

    @XmlPath("messages/@start") 
    private int start; 

    @XmlPath("messages/@total") 
    public int getTotal() { 
     if(null == messages) { 
      return 0; 
     } else { 
      return messages.size(); 
     } 
    } 
} 

消息

import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class Message { 

    private String subject; 

} 

jaxb.properties

要指定莫西爲您的JAXB提供者包括在名爲jaxb.properties文件相同的packa GE與以下條目您的域模型:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

演示

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Folder.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum14372107/input.xml"); 
     Folder folder = (Folder) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(folder, System.out); 
    } 

} 

的input.xml /輸出

<?xml version="1.0" encoding="UTF-8"?> 
<folder> 
    <messages start="1" total="2"> 
     <message> 
     <subject>XXXX</subject> 
     </message> 
     <message> 
     <subject>YYYY</subject> 
     </message> 
    </messages> 
</folder> 

更多信息

相關問題