CXF可以简单实现以String,User,List<User>等JavaBean类型作为形参或返回值进行传输。
String sayHello(String name);
User getUser(int id);
List<User> getAllUser();
但却不能传输Map类型的形参或返回值,为了实现这个功能,需要进行转换,将非JavaBean类型转换为JavaBean类型。
package com.skymr.hello.ws;
import java.util.Map;
import javax.jws.WebService;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import com.skymr.hello.ws.adapter.MapUserAdapter;
import com.skymr.hello.ws.model.User;
@WebService
public interface HelloWorld {
public String sayHello(String name);
public @XmlJavaTypeAdapter(MapUserAdapter.class)Map<String,User> getAllUsers();
}
使用@XmlJavaTypeAdapter进行注解,添加一个转换器,转换器自己实现,需要继承XmlAdapter
package com.skymr.hello.ws.adapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import com.skymr.hello.ws.model.User;
public class MapUserAdapter extends XmlAdapter<MapUserType, Map<String,User>>{
@SuppressWarnings("unchecked")
@Override
public MapUserType marshal(Map<String, User> v) throws Exception {
MapUserType ret = new MapUserType();
List<MapUserType.Entry> list = new ArrayList<MapUserType.Entry>();
for(Object o :v.entrySet()){
String key = ((Map.Entry)o).getKey().toString();
User user = (User)((Map.Entry)o).getValue();
MapUserType.Entry entry = new MapUserType.Entry();
entry.setKey(key);
entry.setUser(user);
list.add(entry);
}
ret.setEntryList(list);
return ret;
}
@Override
public Map<String, User> unmarshal(MapUserType v) throws Exception {
Map<String,User> ret = new HashMap<String,User>();
for(MapUserType.Entry entry : v.getEntryList()){
ret.put(entry.getKey(), entry.getUser());
}
return ret;
}
}
中转类型:Map可转换成其他JavaBeanpackage com.skymr.hello.ws.adapter;
import java.util.List;
import com.skymr.hello.ws.model.User;
public class MapUserType {
public static class Entry{
private String key;
private User user;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
private List<Entry> entryList;
public List<Entry> getEntryList() {
return entryList;
}
public void setEntryList(List<Entry> entryList) {
this.entryList = entryList;
}
}
客户端调用时,返回值也不是Map类型,而是 MapUserType
package com.skymr.hello.ws.pub;
import com.skymr.hello.ws.Entry;
import com.skymr.hello.ws.HelloWorld;
import com.skymr.hello.ws.MapUserType;
import com.skymr.hello.ws.impl.HelloWorldws;
public class ClientMain {
public static void main(String[] args){
HelloWorldws factory = new HelloWorldws();
HelloWorld hw = factory.getHelloWorldBeanPort();
System.out.println(hw.sayHello("skymr"));
MapUserType type = hw.getAllUsers();
for(Entry entry : type.getEntryList()){
System.out.println(entry.getKey()+","+entry.getUser().getUserName());
}
}
}