天天看点

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());
		
	}

}
           

继续阅读