前文展示了使用別名更改XML展示內容,在這一節,可以使用註解更簡單的更改XML展示。
(1)最簡單的註解示例
1. 輸出響應消息
package com.favccxx.favsoft.pojo; public class ResponseMessage { private int messageType; private String messageContent; public ResponseMessage(int messageType, String messageContent){ this.messageType = messageType; this.messageContent = messageContent; } public int getMessageType() { return messageType; } public void setMessageType(int messageType) { this.messageType = messageType; } public String getMessageContent() { return messageContent; } public void setMessageContent(String messageContent) { this.messageContent = messageContent; } }
2. 開始測試
package com.favccxx.favsoft.main; import com.favccxx.favsoft.pojo.ResponseMessage; import com.thoughtworks.xstream.XStream; public class MainAnnotations { public static void main(String[] args) { XStream stream = new XStream(); ResponseMessage msg = new ResponseMessage(200, "成功"); System.out.println(stream.toXML(msg)); } }
3. 測試結果
<com.favccxx.favsoft.pojo.ResponseMessage> <messageType>200</messageType> <messageContent>成功</messageContent> </com.favccxx.favsoft.pojo.ResponseMessage>
4. 使用註解後的輸出內容
package com.favccxx.favsoft.pojo; import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("message") public class ResponseMessage { @XStreamAlias("type") private int messageType; @XStreamAlias("content") private String messageContent; public ResponseMessage(int messageType, String messageContent){ this.messageType = messageType; this.messageContent = messageContent; } public int getMessageType() { return messageType; } public void setMessageType(int messageType) { this.messageType = messageType; } public String getMessageContent() { return messageContent; } public void setMessageContent(String messageContent) { this.messageContent = messageContent; } }
xstream.processAnnotations(ResponseMessage.class);
<message> <type>200</type> <content>成功</content> </message>
(2)使用集合註解
2.1 響應消息對象
package com.favccxx.favsoft.pojo; import java.util.Arrays; import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; @XStreamAlias("message") public class ResponseMessage { @XStreamAlias("type") private int messageType; @XStreamAlias("content") private List<String> messageContent; public ResponseMessage(int messageType, String ... messageContent){ this.messageType = messageType; this.messageContent = Arrays.asList(messageContent); } public int getMessageType() { return messageType; } public void setMessageType(int messageType) { this.messageType = messageType; } public List<String> getMessageContent() { return messageContent; } public void setMessageContent(List<String> messageContent) { this.messageContent = messageContent; } }
2.2 開始測試
package com.favccxx.favsoft.main; import com.favccxx.favsoft.pojo.ResponseMessage; import com.thoughtworks.xstream.XStream; public class MainAnnotations { public static void main(String[] args) { XStream xstream = new XStream(); xstream.processAnnotations(ResponseMessage.class); ResponseMessage msg = new ResponseMessage(28, "終於爬上來了!","我忘帶鑰匙了!!!"); System.out.println(xstream.toXML(msg)); } }
2.3 輸出結果
<message> <type>28</type> <content class="java.util.Arrays$ArrayList"> <a class="string-array"> <string>終於爬上來了!</string> <string>我忘帶鑰匙了!!!</string> </a> </content> </message>
2.4使用@XStreamImplicit註解將集合標記爲隱式集合
package com.favccxx.favsoft.pojo; import java.util.Arrays; import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamImplicit; @XStreamAlias("message") public class ResponseMessage { @XStreamAlias("type") private int messageType; @XStreamImplicit private List<String> messageContent; public ResponseMessage(int messageType, String... messageContent) { this.messageType = messageType; this.messageContent = Arrays.asList(messageContent); } public int getMessageType() { return messageType; } public void setMessageType(int messageType) { this.messageType = messageType; } public List<String> getMessageContent() { return messageContent; } public void setMessageContent(List<String> messageContent) { this.messageContent = messageContent; } }
2.5 輸出結果
<message> <type>28</type> <string>終於爬上來了!</string> <string>我忘帶鑰匙了!!!</string> </message>
2.6 在原有註解對象上,對字段進行別名
package com.favccxx.favsoft.pojo; import java.util.Arrays; import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamImplicit; @XStreamAlias("message") public class ResponseMessage { @XStreamAlias("type") private int messageType; @XStreamImplicit(itemFieldName="dialog") private List<String> messageContent; public ResponseMessage(int messageType, String... messageContent) { this.messageType = messageType; this.messageContent = Arrays.asList(messageContent); } public int getMessageType() { return messageType; } public void setMessageType(int messageType) { this.messageType = messageType; } public List<String> getMessageContent() { return messageContent; } public void setMessageContent(List<String> messageContent) { this.messageContent = messageContent; } }
2.7 輸出內容如下
<message> <type>28</type> <dialog>終於爬上來了!</dialog> <dialog>我忘帶鑰匙了!!!</dialog> </message>
(3)屬性別名
3.1響應消息
package com.favccxx.favsoft.pojo; import java.util.Arrays; import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamAsAttribute; import com.thoughtworks.xstream.annotations.XStreamConverter; import com.thoughtworks.xstream.annotations.XStreamImplicit; import com.thoughtworks.xstream.converters.basic.BooleanConverter; @XStreamAlias("message") public class ResponseMessage { @XStreamAlias("type") @XStreamAsAttribute private int messageType; @XStreamImplicit(itemFieldName = "dialog") private List<String> messageContent; @XStreamAsAttribute @XStreamConverter(value = BooleanConverter.class, booleans = { false }, strings = { "yes", "no" }) private boolean important; public ResponseMessage(int messageType, boolean important, String... messageContent) { this.messageType = messageType; this.messageContent = Arrays.asList(messageContent); this.important = important; } public int getMessageType() { return messageType; } public void setMessageType(int messageType) { this.messageType = messageType; } public List<String> getMessageContent() { return messageContent; } public void setMessageContent(List<String> messageContent) { this.messageContent = messageContent; } }
3.2輸出內容
<message type="28" important="yes"> <dialog>終於爬上來了!</dialog> <dialog>我忘帶鑰匙了!!!</dialog> </message>
(4)所有字段變爲文本,值得注意的是,轉換爲文本的內容,只能是String類型的,因爲轉換器是StringValueConvertor。
package com.favccxx.favsoft.pojo; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamConverter; import com.thoughtworks.xstream.converters.basic.BooleanConverter; import com.thoughtworks.xstream.converters.extended.ToAttributedValueConverter; @XStreamAlias("message") @XStreamConverter(value = ToAttributedValueConverter.class, strings = { "messageContent" }) public class ResponseMessage { @XStreamAlias("type") private int messageType; @XStreamAlias("content") private String messageContent; @XStreamConverter(value = BooleanConverter.class, booleans = { false }, strings = { "yes", "no" }) private boolean important; public ResponseMessage(int messageType, boolean important, String messageContent) { this.messageType = messageType; this.messageContent = messageContent; this.important = important; } public int getMessageType() { return messageType; } public void setMessageType(int messageType) { this.messageType = messageType; } public String getMessageContent() { return messageContent; } public void setMessageContent(String messageContent) { this.messageContent = messageContent; } public boolean isImportant() { return important; } public void setImportant(boolean important) { this.important = important; } }
<message type="200" important="yes">今天星期五</message>
(5)省略字段
package com.favccxx.favsoft.pojo; import java.util.Arrays; import java.util.List; import com.thoughtworks.xstream.annotations.XStreamAlias; import com.thoughtworks.xstream.annotations.XStreamConverter; import com.thoughtworks.xstream.annotations.XStreamImplicit; import com.thoughtworks.xstream.annotations.XStreamOmitField; import com.thoughtworks.xstream.converters.basic.BooleanConverter; @XStreamAlias("message") public class ResponseMessage { @XStreamOmitField private int messageType; @XStreamImplicit(itemFieldName="content") private List<String> messageContent; @XStreamConverter(value = BooleanConverter.class, booleans = { false }, strings = { "yes", "no" }) private boolean important; public ResponseMessage(int messageType, boolean important, String... messageContent) { this.messageType = messageType; this.important = important; this.messageContent = Arrays.asList(messageContent); } public int getMessageType() { return messageType; } public void setMessageType(int messageType) { this.messageType = messageType; } public List<String> getMessageContent() { return messageContent; } public void setMessageContent(List<String> messageContent) { this.messageContent = messageContent; } public boolean isImportant() { return important; } public void setImportant(boolean important) { this.important = important; } }
<message> <content>今天星期五</content> <content>明天去逛街</content> <important>yes</important> </message>
(6)自動檢測註解
可以使用下述方法自動檢測註解,而不用每次都爲每個類設置註解
xstream.autodetectAnnotations(true); // xstream.processAnnotations(ResponseMessage.class);
總結:使用註解比別名方便易用,但是當一個類被多次重用時,使用別名會更明智些。