1、首先在web.xml里配置
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
//此处为生成的jws地址的前缀
<url-pattern>/WebService/*</url-pattern>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring-MVC.xml,
//cxf-service.xml为jws的配置文件
classpath:cxf-service.xml
</param-value>
</context-param>
2、以下列出需要调用的接口及实现
public interface LogService {
public List list(Map model);
}
public class LogServiceImpl implements LogService {
public List list(Map model){
//此处调用了mybatis配置文件里的一个sql来返回所有的日志信息
return getSqlMapClientTemplate().queryForList("logPQ", model);
}
}
3、jws接口及实现
/**
* 查询日志列表
* @author chang.jar
*/
@SuppressWarnings("all")
@WebService
public interface LogJWS {
@WebMethod
@XmlJavaTypeAdapter(value=ListMapAdapter.class)//此处为自己写的适配器
@WebResult
public List list(Map model);
}
public class LogJWSImpl extends LogServiceImpl implements LogJWS {
@Override
public TableDto list(Map model) {
return super.list(model);
}
}
4、适配器类:
//简单数据类型 如:String,int 和集合List是不需要适配器进行转换的,而Map是需要的,鉴于网上的例子大多是Map,这里我就写个List<map>类型的
代码如下:
/**
* List<map>类型的适配器
* @author chang.jar
*/
public class ListMapAdapter extends XmlAdapter<ListMapConvertor, List<Map<String,Object>>>{
@Override
public List<Map<String, Object>> unmarshal(ListMapConvertor lmc)
throws Exception {
List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
Map<String, Object> map = new HashMap<String, Object>();
for(ListMapConvertor.MapPojo m : lmc.getMapPojo()){
map.put(m.getKey(), m.getMap());
list.add(map);
}
return list;
}
@Override
public ListMapConvertor marshal(List<Map<String, Object>> listMap)
throws Exception {
ListMapConvertor lmc = new ListMapConvertor();
if(listMap != null){
MapPojo mapPojo = new MapPojo();
for(int i=0; i<listMap.size(); i++){
Map<String,Object> map = listMap.get(i);
for (Map.Entry<String, Object> entry : map.entrySet()) {
mapPojo.setKey(entry.getKey());
mapPojo.setMap(entry.getValue());
}
}
lmc.addMapPojo(mapPojo);
}
return lmc;
}
}
适配器所用到的实体:
@XmlType(name = "ListMapConvertor")
@XmlAccessorType(XmlAccessType.FIELD)
public class ListMapConvertor {
private List<MapPojo> mapPojo = new ArrayList<MapPojo>();
public List<MapPojo> getMapPojo() {
return mapPojo;
}
public void setMapPojo(List<MapPojo> mapPojo) {
this.mapPojo = mapPojo;
}
public void addMapPojo(MapPojo pojo){
mapPojo.add(pojo);
}
public static class MapPojo{
private String key;
private Object map;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public Object getMap() {
return map;
}
public void setMap(Object map) {
this.map = map;
}
}
}
5、cxf配置文件:
<!-- 查询日志列表 -->
<jaxws:endpoint id="logJWSImpl"
implementor="com.webservice.service.LogJWSImpl"
address="/logJWSImpl">
<jaxws:inInterceptors>
<!-- 此处为安全认证,具体内容不再提供 -->
<ref bean="soapAuth" />
</jaxws:inInterceptors>
</jaxws:endpoint>
6、客户端的调用
public class TestWebService {
//ws接口地址
private static final String url = "http://localhost:10086/WebService/logJWSImpl";
//ws接口全限定类名
private static final String wsInterfaceName = "com.webservice.service.logJWS";
public static void main(String[] args) {
System.out.println("Begin to call the service ...");
Object service = doGeneral(url, wsInterfaceName);
doLogJWS((LogJWS)service);
System.out.println("End to call the service ...");
}
/**
* 查询日志列表
* @param service
*/
private static void doLogJWS(LogJWS service) {
HashMap map = new HashMap();
map.put("start", "0");
map.put("limit", "100");
map.put("page", "1");
List list = service.list(map);
System.out.println("List:" + list.size());
}
/**
* 通用部分
*/
public static Object doGeneral(String urlStr, String objectName){
JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
Class<?> clazz = null;
try {
clazz = Class.forName(objectName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
factoryBean.setServiceClass(clazz);
factoryBean.setAddress(urlStr);
ArrayList listHeaders = new ArrayList();
AddSoapHeader soapHeader = new AddSoapHeader(urlStr);
listHeaders.add(soapHeader);
listHeaders.add(new org.apache.cxf.interceptor.LoggingOutInterceptor());
factoryBean.setOutInterceptors(listHeaders);
Object service = factoryBean.create();
return service;
}
}