我習慣以Code-First的方式開發webservice,即先編碼實作再定義wsdl檔案,wsdl檔案就是這個webservice的xml語言描述。
技術選擇上我習慣用jdk1.6自帶的注解結合Apache的CXF架構開發。
WebService我認為就是做了資料交換這樣一件事,這個過程中最關鍵就是Java類型和XML資料類型之間的轉換,JAX-WS底層用的類型轉換機制為JAXB
JAXB不支援接口 、Map 與XML之間的直接轉換。
開發過程中常用的注解及了解:
@WebService定義wsdl檔案中相關屬性的配置
@WebResult定義wsdl檔案中與方法傳回結果資料類型映射的xml資料類型元素的名字
@WebPrame定義wsdl檔案中與方法參數資料類型映射的xml資料類型元素的名字
@XmlType定義wsdl檔案中與該Pojo映射的xml資料類型的名字
@XmlAccessorType定義一個pojo的映射機制,有property和fild兩種
@XmlRootElement定義wsdl檔案中與該pojo映射的xml類型的根元素名稱
@XmlJavaTypeAdapter給wsdl無法映射的java類型配置一個擴充卡
典型的webservice開發:
1.定義接口
package com.cxf.ws;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import com.cxf.adaptor.MapAdaptor;
import com.cxf.pojo.Book;
import com.cxf.pojo.User;
@WebService
public interface HelloService {
// Simple Type
@WebResult(name="sayHelloReturn",targetNamespace="http://ws.cxf.com")
public String sayHello(
@WebParam(name="name",targetNamespace="http://ws.cxf.com")
String name );
// pojo
@WebResult(name="sayHelloUserReturn",targetNamespace="http://ws.cxf.com")
public User sayUser(
@WebParam(name="user" ,targetNamespace="http://ws.cxf.com")
User user );
// list
@WebResult(name="sayBookListReturn",targetNamespace="http://ws.cxf.com")
public List<Book> sayBookList(
@WebParam(name="bookList",targetNamespace="http://ws.cxf.com")
List<Book> bookList);
// HashMap
@WebResult(name="sayBookHashMapReturn",targetNamespace="http://ws.cxf.com")
@XmlJavaTypeAdapter(MapAdaptor.class)
public HashMap<String,Book> sayBookHashMap(
@WebParam(name="bookHashMap" ,targetNamespace="http://ws.cxf.com")
@XmlJavaTypeAdapter(MapAdaptor.class)
HashMap<String,Book> bookHashMap);
// Map
@WebResult(name="sayBookMapReturn",targetNamespace="http://ws.cxf.com")
@XmlJavaTypeAdapter(MapAdaptor.class)
public Map<String,Book> sayBookMap(
@WebParam(name="bookMap" ,targetNamespace="http://ws.cxf.com")
@XmlJavaTypeAdapter(MapAdaptor.class)
Map<String,Book> bookMap);
// Map
@WebResult(name="getBooksReturn",targetNamespace="http://ws.cxf.com")
@XmlJavaTypeAdapter(MapAdaptor.class)
public Map<String,Book> getBooks();
}
2.開發擴充卡相對應的類
package com.cxf.adaptor;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import com.cxf.adaptor.MapBroker.MapEntry;
import com.cxf.pojo.Book;
public class MapAdaptor extends XmlAdapter<MapBroker, Map<String,Book>> {
@Override
public Map<String, Book> unmarshal(MapBroker broker)
throws Exception {
Map<String,Book> map = new HashMap<String,Book>();
for(MapBroker.MapEntry entry : broker.getMapEntrys()){
map.put(entry.getKey(), entry.getValue());
}
return map;
}
public MapBroker marshal(Map<String, Book> map)
throws Exception {
MapBroker broker = new MapBroker();
for( String key : map.keySet()){
broker.getMapEntrys().add(new MapEntry(key,map.get(key)));
}
return broker;
}
}
3.開發擴充卡依賴的pojo
package com.cxf.adaptor;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import com.cxf.pojo.Book;
@XmlType(name="MapBroker")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="MapBroker")
public class MapBroker implements Serializable{
private static final long serialVersionUID = 1L;
private List<MapEntry> mapEntrys = new ArrayList<MapEntry>();
public static class MapEntry {
String key;
Book value;
MapEntry(){}
MapEntry( String key,Book value ){
this.key = key;
this.value = value;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Book getValue() {
return value;
}
public void setValue(Book value) {
this.value = value;
}
}
public void setMapEntrys(MapEntry entry){
mapEntrys.add(entry);
}
public List<MapEntry> getMapEntrys() {
return mapEntrys;
}
}
4.開發webservice實作類
package com.cxf.ws;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.jws.WebService;
import com.cxf.pojo.Book;
import com.cxf.pojo.User;
@WebService(name="HelloService",serviceName="HelloService",
portName="HelloServicePort",
endpointInter,
targetNamespace="http://ws.cxf.com")
public class HelloServiceimpl implements HelloService {
public String sayHello(String name) {
System.out.println(" sayHello: "+name);
return " hello "+name;
}
public User sayUser(User user) {
System.out.println(" sayUser: "+user.getName()+" bookList: "+user.getFriendsList().size()+" bookMap: "+user.getFriendsMap().size());
return user;
}
public List<Book> sayBookList(List<Book> userList) {
System.out.println(" sayBookList: "+userList.size());
return userList;
}
public Map<String, Book> sayBookMap(Map<String, Book> userMap) {
System.out.println(" sayBookMap: "+userMap.size());
return userMap;
}
public HashMap<String, Book> sayBookHashMap(HashMap<String, Book> userMap) {
System.out.println(" sayBookHashMap: "+userMap.size());
return userMap;
}
public Map<String, Book> getBooks() {
// TODO Auto-generated method stub
Map<String,Book> map = new HashMap<String,Book>();
map.put("karl", new Book());
return map;
}
}
5.釋出、并調用Ws
釋出:
public static void main(String[] args ){
Endpoint.publish("http://localhost:9090/helloService", new HelloServiceimpl());
}
調用:
1. 首先在指令行下輸入 wsdl2java -fe jaxws21 http://localhost:9090/helloService?wsdl 自動生成用戶端。
2. 編寫類調用,代碼示例:
import java.util.ArrayList;
import java.util.List;
import com.cxf.ws.Book;
import com.cxf.ws.GetBooks;
import com.cxf.ws.GetBooksResponse;
import com.cxf.ws.HelloService;
import com.cxf.ws.HelloService_Service;
import com.cxf.ws.MapBroker;
import com.cxf.ws.MapEntry;
import com.cxf.ws.SayBookList;
import com.cxf.ws.SayBookListResponse;
import com.cxf.ws.SayBookMap;
import com.cxf.ws.SayBookMapResponse;
import com.cxf.ws.SayHello;
import com.cxf.ws.SayHelloResponse;
import com.cxf.ws.SayUser;
import com.cxf.ws.SayUserResponse;
import com.cxf.ws.User;
import com.cxf.ws.User.FriendsMap.Entry;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
HelloService service = new HelloService_Service().getHelloServicePort();
// Call the sayHello( String name )
String name = "karl";
SayHello sayHello = new SayHello();
sayHello.setName(name);
SayHelloResponse sayHelloResponse = service.sayHello(sayHello);
System.out.println(sayHelloResponse.getSayHelloReturn());
// Call the sayUser( User user )
User user = new User();
user.setAge(10);
user.setName("oliver");
Book book = new Book();
book.setId(1);
book.setName("book");
user.getFriendsList().add(book); //Set List
Entry entry = new Entry();
entry.setKey("oliver");
entry.setValue(book);
user.getFriendsMap().getEntry().add(entry); //Set Map
SayUser userMsg = new SayUser();
userMsg.setUser(user);
SayUserResponse sayUserResponse = service.sayUser(userMsg);
System.out.println(sayUserResponse.getSayHelloUserReturn().getName());
// Call sayBookList( List<Book> bookList )
SayBookList sayBookList = new SayBookList();
List<Book> bookList = new ArrayList<Book>();
bookList.add(new Book());
sayBookList.setBookList(bookList);
SayBookListResponse sayBookListResponse = service.sayBookList(sayBookList);
System.out.println(sayBookListResponse.getSayBookListReturn().size());
// Call Map<String,Book> sayBookMap( Map<String,Book> bookMap)
SayBookMap saybookMap = new SayBookMap();
MapBroker broker = new MapBroker();
broker.getMapEntrys().add(new MapEntry());
saybookMap.setBookMap(broker);
SayBookMapResponse sayBookMapResponse = service.sayBookMap(saybookMap);
System.out.println(sayBookMapResponse.getSayBookMapReturn().getMapEntrys().size());
// Call Map<String,Book> getBooks()
GetBooksResponse getBooksResponse = service.getBooks(new GetBooks());
System.out.println(getBooksResponse.getGetBooksReturn().getMapEntrys().size());
// MapBroker broker = new MapBroker();
// MapEntry entry = new MapEntry();
// entry.setKey("karl");
// entry.setValue(new UserRoot());
// broker.getMapEntrys().add(entry);
// SayUserMap map = new SayUserMap();
// map.setUserMap(broker);
//
// SayUserMapResponse response = service.sayUserMap(map);
// broker = response.getSayHelloMapReturn();
//service.getUsers(new GetUsers());
}
}