最近在使用AXIS2部署Web Service,關於若是使用axis2部署Web Service的方法不想在這裏多說,網站有不少相關的文章,這裏只想談談AXIOM對象與Java中的對象的轉換方法。java
關於AXIOM的介紹,下面這個片斷已經說得很明白了:apache
AXIOM數組
AXIs 對象模型 (AXIOM) 是一個 XML 對象模型,設計用於提升 XML 處理期間的內存使用率和性能,基於 Pull 解析。經過使用 Streaming API for XML (StAX) Pull 解析器,AXIOM(也稱爲 OM)能夠控制解析過程,以提供延遲構建支持。延遲構建是指 AXIOM 不徹底構建對象模型,模型的其他部分基於用戶的需求構建。如下示例對此概念進行了說明:app
假定某個用戶須要從 XML 輸入流中得到第一我的的 <Location>
元素值,AXIOM 構建的對象模型將一直包含到<Location>
元素結束的內容,而讓其餘內容保留在流中:性能
清單 1. 對象模型的 AXIOM 部分構建優化
<Persons> <Person> <Name>Dihini Himahansi</Name> <Sex>Female</Sex> <Location>Colombo, Sri Lanka</Location> <--- Object model is being built only up to this point </Person> <Person> <Name>Thushari Damayanthi</Name> <Sex>Female</Sex> <Location>Elpitiya, Sri Lanka</Location> </Person> </Persons> |
這裏的優點在於,儘量僅使用能知足用戶的需求的內存。若是用戶但願訪問較大的文檔中前面的數個字節或數千字節,則延遲構建功能將改善該應用程序的內存需求狀況。網站
能夠從任何元素得到 StAX 事件,而不論是否完整構建了對象模型。在有些狀況下,Axis 2 中的此功能很是有用。例如,當 Axis2 做爲中介傳遞時,若是須要僅讀取 SOAP 消息的 Header,AXIOM 將防止其讀取整個 SOAP 消息,使其具備很高的內存效率。另外一個例子是,當 Web 服務實現可以直接使用 StAX 事件時,因爲採用了 AXIOM,Web 服務所需的內存很是小。ui
此外,AXIOM 內置了消息傳輸優化機制(Message Transfer Optimization Mechanism,MTOM)支持。對於 AXIOM 體系結構,能夠經過實現 AXIOM 接口並將其插入到 Axis2 中來執行本身的對象模型。this
因爲 AXIOM 最初是做爲 Axis2 的對象模型而開發的,所以 AXIOM 提供了構建於基礎 AXIOM API 之上的 SOAP 接口。這容許您使用 envelope.getHeaders
和 envelope.getBody
之類的便利方法查看 SOAP。編碼
AXIS2會將Web Service方法中的參數或返回值中的自定義對象、數組、List等類型統一映射爲OMElement類型,這就咱們須要編寫OMElement與自定義類型質檢的轉換方法,下面給出幾個經常使用的方法:
CASE1:自定義對象生成OMElement方法:
Person man = new Person();
man.setName("Warlaze");
man.setAge(25);
man.setAddress("Bei jing");
man.setPhonenum("13900000000");
javax.xml.stream.XMLStreamReader reader = BeanUtil.getPullParser(man);
StreamWrapper parser = new StreamWrapper(reader);
StAXOMBuilder stAXOMBuilder =OMXMLBuilderFactory.createStAXOMBuilder(OMAbstractFactory.getOMFactory(), parser);
OMElement element = stAXOMBuilder.getDocumentElement();
CASE2:List或Array類型生成OMElement方法:
List<Person> list = new ArrayList<Person>();
list.add(man);
list.add(man);
OMElement omElement = BeanUtil.getOMElement(new QName("root"), list
.toArray(), new QName("person"), false, null);
CASE3:解析包含基本類型的List或Array生成的OMElement的方法:
private static List<String> getResults(OMElement element) {
if(element == null){
return null;
}
Iterator iterator = element.getChildElements();
List<String> list = new ArrayList<String>();
while (iterator.hasNext()) {
OMNode omNode = (OMNode) iterator.next();
if (omNode.getType() == OMNode.ELEMENT_NODE) {
OMElement omElement = (OMElement) omNode;
if (omElement.getLocalName().equals("string")) {
String temp = omElement.getText().trim();
System.out.println(temp);
list.add(temp);
}
}
}
return list;
}
CASE4:解析包含自定義Java類型的List或Array的方法:
private static List<Person> getResults(OMElement element) throws AxisFault {
if (element == null) {
return null;
}
Iterator iterator = element.getChildElements();
List<Person> list = new ArrayList<Person>();
while (iterator.hasNext()) {
OMNode omNode = (OMNode) iterator.next();
if (omNode.getType() == OMNode.ELEMENT_NODE) {
OMElement omElement = (OMElement) omNode;
if (omElement.getLocalName().toLowerCase().equals("person")) {
Person person = (Person) BeanUtil.processObject(omElement,
Person.class, null, true,
new DefaultObjectSupplier());
list.add(person);
}
}
}
return list;
}
ps:
在如今項目中使用axis2,發現其源碼有一個問題:
在org.apache.axis2.databinding.utils.BeanUtil.java-500 line
String partsLocalName = parts.getLocalName();
PropertyDescriptor prty = (PropertyDescriptor)properties.get(
partsLocalName.toLowerCase());
if (prty != null) {...
能夠看到,在第500行進行了一個toLowerCase()轉換,致使自定義類型的轉換出現bean屬性丟失,
將它去掉,從新打包就能夠正常運行了;
不明白爲何axis2工做小組要進行這樣處理呢;
不知道這算不算一個bug,總不能就規定咱們只能使用所有小寫字母來定義bean屬性吧,有違java編碼規範啊;
看來要給apache反應一下