在写一个webservice的时候,方法的返回值是一个复杂类型,处理方法是写一个结果类(Javabean)作为返回值。想着webservice方法返回值为Map的没写过,然后就试着写了一个简单的Demo。出错了...那我就来劲了,总有办法解决吧....
通过百度(你有Google癖好就用Google吧)。。找到方法,通过前辈们的经验找到解决方法。
业内人士都懂!注重版权,奉上原文链接:
http://blog.csdn.net/jspamd/article/details/8914427
贴上自个Demo代码之前,补充个知识点,webservice中发布方法的参数以及返回值可以很好的处理基本类型,POJO类,数组,以及list集合等复杂类型,但是在处理Map,非JavaBean式的类,我们需要自定义一个转换器,负责将webservice中不能处理的类型转换为可以处理的类型
(1)需要使用注解@XmlJavaTypeAdapter修饰返回类型
@WebService
public interface HelloService {
public String sayHello(String name);
public String sayGoodBy(String name);
public String sayHello2(String name); public @XmlJavaTypeAdapter((XmlMapAdapter.class)) Map<String, String> getSpace(String name);
}
(2)自定义一个可以替代不可处理参数类型的类(可以理解为模拟Map接口的类,这个类是POJO)
public class MyStringMap {
private List<Entry> entries; /**
* @return entries
*/
public List<Entry> getEntries() {
return entries;
} /**
* @param entries the entries to set
*/
public void setEntries(List<Entry> entries) {
this.entries = entries;
} public static class Entry {
private String key;
private String value;
/**
* @return key
*/
public String getKey() {
return key;
}
/**
* @param key the key to set
*/
public void setKey(String key) {
this.key = key;
}
/**
* @return value
*/
public String getValue() {
return value;
}
/**
* @param value the value to set
*/
public void setValue(String value) {
this.value = value;
} }
}
(3)自定义一个转换器(作为@XmlJavaTypeAdapter注解中value)
public class XmlMapAdapter extends XmlAdapter<MyStringMap, Map<String, String>>{
@Override
//Map(不可处理)转换为可处理的类(自定义的POJO类,就是模拟Map的一个类)
public MyStringMap marshal(Map<String, String> v) throws Exception {
MyStringMap result = new MyStringMap();
List<pojo.MyStringMap.Entry> entries = new ArrayList<MyStringMap.Entry>();
for(Entry<String, String> e : v.entrySet()){
pojo.MyStringMap.Entry entry = new pojo.MyStringMap.Entry();
entry.setKey(e.getKey());
entry.setValue(e.getValue());
entries.add(entry);
}
result.setEntries(entries);
return result; }
//自定义可处理类转换为Map(不可处理的类型)
@Override
public Map<String, String> unmarshal(MyStringMap v) throws Exception {
Map<String, String> result = new HashMap<String, String>();
for(pojo.MyStringMap.Entry e : v.getEntries()){
result.put(e.getKey(), e.getValue());
}
return result;
}
}
(4)接口的实现类
@WebService(endpointInterface="com.webservice.HelloService",serviceName="MyService",targetNamespace="http://www.baidu.com")
public class HelloServiceImpl implements HelloService { @WebMethod(operationName="AliassayHello")
@WebResult(name="myReturn")
@Override
public String sayHello(@WebParam(name="name")String name) {
System.out.println("Hello,"+name);
return "Hello,"+name;
} @Override
public String sayGoodBy(@WebParam(name="name")String name) {
System.out.println("GoodBy,"+name);
return "GoodBy,"+name;
} @WebMethod(exclude=true)//不会被发布出去
@Override
public String sayHello2(String name) {
System.out.println("hello2"+ name);
return "Hello2,"+name;
} @Override
public Map<String, String> getSpace(String name) {
HashMap<String, String> resultMap = new HashMap<String,String>(); resultMap.put("age", "12");
resultMap.put("name", name);
resultMap.put("orid", "123123");
resultMap.put("address", "北京"); System.out.println(resultMap);
return resultMap;
} public static void main(String[] args) {
Endpoint.publish("http://127.0.0.1:8099/hello", new HelloServiceImpl());
System.out.println("服务发布成功!");
} }
剩下的就是测试工作,这里就没写客户端程序去测试了,使用SoapUI测试下
soap请求消息:
soap响应
个人理解webservice中的转换器的思想机制和struts2 中的类型转换机制是一个样的。
朋友,看我这么帅,点个赞呗