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;
    }
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章