cxf webservice 实例(复合类型适配器)

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;
    }
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值