天天看點

Java開發WebService入門

我習慣以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());
		
	}

}
           

繼續閱讀