`

解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题

 
阅读更多

 

 

在项目中使用Apache开源的Services Framework CXF来发布WebService,CXF能够很简洁与Spring Framework 集成在一起,在发布WebService的过程中,发布的接口的入参有些类型支持不是很好,比如Timestamp和Map。这个时候我们就需要编写一些适配来实行类型转换。

 

TimestampAdapter.java

 
package com.loongtao.general.crawler.webservice.utils;

import java.sql.Timestamp;

import javax.xml.bind.annotation.adapters.XmlAdapter;

/**
 * <java.sql.Timestamp类型转换> <功能详细描述>
 * 在相应的字段前面  加上  @XmlJavaTypeAdapter(TimestampAdapter.class)
 * @author Lilin
 */
public class TimestampAdapter extends XmlAdapter<String, Timestamp> {

    /**
     * <一句话功能简述> <功能详细描述>
     * 
     * @param time
     * @return
     * @throws Exception
     * @see [类、类#方法、类#成员]
     */
    public String marshal(Timestamp time) throws Exception {
        return DateUtil.timestamp2Str(time);
    }

    /**
     * <一句话功能简述> <功能详细描述>
     * 
     * @param v
     * @throws Exception
     * @see [类、类#方法、类#成员]
     */
    public Timestamp unmarshal(String str) throws Exception {
        return DateUtil.str2Timestamp(str);
    }
}
 

DateUtil.java

 
package com.loongtao.general.crawler.webservice.utils;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;

import org.apache.log4j.Logger;

/**
 * <一句话功能简述> <功能详细描述>
 * 
 * @author Lilin
 * @version
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class DateUtil {
    /**
     * 注释内容
     */
    private static final Logger log = Logger.getLogger(DateUtil.class);
    /**
     * 默认日期格式
     */
    private static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";

    /**
     * <默认构造函数>
     */
    private DateUtil() {
    }

    /**
     * <字符串转换成日期> <如果转换格式为空,则利用默认格式进行转换操作>
     * 
     * @param str
     *            字符串
     * @param format
     *            日期格式
     * @return 日期
     * @see [类、类#方法、类#成员]
     */
    public static Date str2Date(String str, String format) {
        if (null == str || "".equals(str)) {
            return null;
        }
        // 如果没有指定字符串转换的格式,则用默认格式进行转换
        if (null == format || "".equals(format)) {
            format = DEFAULT_FORMAT;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        Date date = null;
        try {
            date = sdf.parse(str);
            return date;
        } catch (ParseException e) {
            log.error("Parse string to date error!String : " + str);
        }

        return null;
    }

    /**
     * <一句话功能简述> <功能详细描述>
     * 
     * @param date
     *            日期
     * @param format
     *            日期格式
     * @return 字符串
     * @see [类、类#方法、类#成员]
     */
    public static String date2Str(Date date, String format) {
        if (null == date) {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }

    /**
     * <时间戳转换为字符串> <功能详细描述>
     * 
     * @param time
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String timestamp2Str(Timestamp time) {
        Date date = new Date(time.getTime());
        return date2Str(date, DEFAULT_FORMAT);
    }

    /**
     * <一句话功能简述> <功能详细描述>
     * 
     * @param str
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static Timestamp str2Timestamp(String str) {
        Date date = str2Date(str, DEFAULT_FORMAT);
        return new Timestamp(date.getTime());
    }
}
 

在具体的Java Bean 中,通过@XmlJavaTypeAdapter注解来通知CXF进行类型转换,具体请看ErrInfo中的属性timestamp的getter 和setter

 
/*   
 * Copyright (c) 2014-2024 . All Rights Reserved.   
 *   
 * This software is the confidential and proprietary information of   
 * LoongTao. You shall not disclose such Confidential Information   
 * and shall use it only in accordance with the terms of the agreements   
 * you entered into with LoongTao.   
 *   
 */
package com.loongtao.general.crawler.webservice.vo;

import java.io.Serializable;
import java.sql.Timestamp;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import com.loongtao.general.crawler.webservice.utils.TimestampAdapter;

/**
 * @declare: 下载失败信息<br>
 * @author: cphmvp
 * @version: 1.0
 * @date: 2014年9月22日下午3:47:26
 */
public class ErrInfo implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -5298849636495962631L;
    private String ip;

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public int getArticleMediaId() {
        return articleMediaId;
    }

    public void setArticleMediaId(int articleMediaId) {
        this.articleMediaId = articleMediaId;
    }
    
    @XmlJavaTypeAdapter(TimestampAdapter.class)
    public Timestamp getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(Timestamp timestamp) {
        this.timestamp = timestamp;
    }

    private String url;
    private int articleMediaId;
    private Timestamp timestamp;

}
 

这个时候CXF解析Java Bean ErrInfo的时候,解析到@XmlJavaTypeAdapter注解时候就会以TimestampAdapter这个适配器来进行Timestamp与String之间的转换。

Map:

用xstream将Map转换成String

 
package com.loongtao.general.crawler.webservice.utils;

import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.annotation.adapters.XmlAdapter;

import org.apache.cxf.aegis.type.java5.XmlType;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import javax.xml.bind.annotation.XmlAccessType;  
import javax.xml.bind.annotation.XmlAccessorType;  

/**
 * <数据模型转换> <Map<String,Object> 与 String之间的转换>
 * 
 * @author Lilin
 * @version
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
@XmlType(name = "MapAdapter")
@XmlAccessorType(XmlAccessType.FIELD)
public class MapAdapter extends XmlAdapter<String, Map<String, Object>> {
    /**
     * Convert a bound type to a value type. 转换JAXB不支持的对象类型为JAXB支持的对象类型
     * 
     * @param map
     *            map The value to be convereted. Can be null.
     * @return String
     * @throws Exception
     *             if there's an error during the conversion. The caller is
     *             responsible for reporting the error to the user through
     *             {@link javax.xml.bind.ValidationEventHandler}.
     */
    public String marshal(Map<String, Object> map) throws Exception {
        XStream xs = new XStream(new DomDriver());
        return xs.toXML(map);
    }

    /**
     * Convert a value type to a bound type. 转换JAXB支持的对象类型为JAXB不支持的的类型
     * 
     * @param model
     *            The value to be converted. Can be null.
     * @return Map<String,Object>
     * @throws Exception
     *             if there's an error during the conversion. The caller is
     *             responsible for reporting the error to the user through
     *             {@link javax.xml.bind.ValidationEventHandler}.
     */
    @SuppressWarnings("unchecked")
    public Map<String, Object> unmarshal(String model) throws Exception {
        XStream xs = new XStream(new DomDriver());
        return (HashMap) xs.fromXML(model);
    }
}
 
原文:http://www.cnblogs.com/gisblogs/p/3988128.html
分享到:
评论

相关推荐

    cxf框架包 apache-cxf-3.4.3.tar.gz

    Apache CXF是一个开源的Java框架,它主要用于构建和开发Web服务。这个框架允许开发者通过SOAP、RESTful HTTP、XML以及各种协议来实现服务接口。在本案例中,我们讨论的是"apache-cxf-3.4.3.tar.gz",这是Apache CXF ...

    apache-cxf-2.1.4.tar.zip webservice

    8. **集成和支持**:CXF与许多其他Java技术无缝集成,如Spring框架、JPA(Java Persistence API)和WS-Security等。此外,它还提供了丰富的扩展点,允许自定义和扩展其功能以满足特定需求。 9. **错误处理和调试**...

    org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar

    org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar

    apache-cxf-2.7.18-src.zip 源码

    7. **工具和支持**:CXF还包含了一系列工具,如代码生成器(用于从WSDL生成Java代码)、部署工具和测试工具。此外,CXF还提供了良好的文档和社区支持,便于开发者学习和解决问题。 在"apache-cxf-2.7.18-src.zip...

    apache-cxf-3.4.4.tar.gz

    Apache CXF 是一个开源的Java框架,主要用于构建和开发Web服务。这个"apache-cxf-3.4.4.tar.gz"文件是Apache CXF的3.4.4版本的源码压缩包,适用于那些希望深入了解其内部工作原理或进行定制化开发的开发者。Apache ...

    apache-cxf-2.6.0.tar.gz

    Apache CXF是一个开源的Java框架,它主要用于构建和开发服务导向架构(SOA)和Web服务。这个"apache-cxf-2.6.0.tar.gz"文件是一个压缩包,包含了Apache CXF 2.6.0版本的所有源代码、库文件、文档和其他资源。这个...

    apache-cxf-3.2.4-src.zip

    Apache CXF是一个开源的Java框架,它主要用于构建和开发服务导向架构(SOA)和Web服务。CXF这个名字来源于两个早期的开源项目:Celtix和XFire的合并,因此得名CXF。该框架提供了丰富的功能,包括SOAP、RESTful、WS-*...

    apache-cxf-3.5.0.zip

    Apache CXF 是一款广泛使用的开源框架,主要用于构建和部署高质量的Web服务。它以其灵活性、易用性和强大的功能集而闻名。"apache-cxf-3.5.0.zip" 文件包含了CXF框架的3.5.0版本,该版本可能包含了一些新特性、改进...

    apache-cxf-2.1.4-src.zip

    10. **社区支持**:作为Apache软件基金会的一个项目,CXF拥有活跃的社区,提供丰富的文档、示例和论坛支持,帮助用户解决问题。 在深入研究源代码时,你可以关注以下几个方面: - **核心组件**:了解CXF如何处理...

    apache-cxf-2.6.2.tar.gz

    10. **社区支持**:作为Apache软件基金会的顶级项目,CXF拥有活跃的社区,提供了丰富的文档、示例和问题解答,帮助开发者快速上手并解决遇到的问题。 总的来说,"apache-cxf-2.6.2.tar.gz"是一个包含完整Apache CXF...

    apache-cxf-2.0.10.zip下载地址

    Apache CXF 2.0.10 版本是该框架的一个历史版本,它提供了对WS-*(Web服务增强)规范的支持,包括WSDL(Web服务描述语言)到Java代码的绑定和Java到WSDL的逆向工程。 WSDL是一种XML格式,用于定义Web服务的接口、...

    apache-cxf-2.7.6.rar

    Apache CXF是一个开源的Java框架,它主要用于构建和开发Web服务。这个"apache-cxf-2.7.6.rar"文件包含的是Apache CXF 2.7.6版本的源码、库文件和其他相关资源。CXF这个名字是“Cocoon XML Framework”的缩写,起初它...

    apache-cxf3.1.15和3.2.3合集及jdk说明

    解决这些问题通常需要查看日志、调试代码,甚至阅读CXF的官方文档和社区论坛。对于初学者来说,理解CXF的工作原理、熟悉其配置方式和API使用是学习的关键。 总的来说,Apache CXF是开发和部署Web服务的强大工具,这...

    apache-cxf-2.7.7.zip

    Apache CXF是一个开源的Java框架,它主要用于构建和开发Web服务。这个"apache-cxf-2.7.7.zip"压缩包包含了CXF框架的2.7.7版本,这是一个在2013年发布的稳定版本。CXF是Apache软件基金会的项目,它集成了多种Web服务...

    apache-cxf-2.5.9-src.zip

    Apache CXF 是一个开源的Java框架,用于构建和开发Web服务。这个"apache-cxf-2.5.9-src.zip"文件包含的是Apache CXF 2.5.9版本的源代码,对于开发者来说,这是一个深入理解CXF工作原理、进行自定义扩展或调试的宝贵...

    cxf-3.1.5 和 cxf-3.3.13 JAVA7和JAVA8对应CXF资源

    JAVA7和JAVA8对应CXF资源 WebService CXF 用了一天时间找,官网打不开,国内要积分,下下来又永不了。最后终于搞到手,上传上来分享给大家。 jdk版本 CXF版本 java 9及以上 3.3.x java 8 3.x java 7 2.2x --- ...

    apache-cxf-3.1.8.zip

    10. **错误处理和调试**:CXF提供了详细的日志记录和异常处理机制,帮助开发者定位和解决问题。其强大的故障跟踪功能对于调试和优化Web服务尤其有用。 在"apache-cxf-3.1.8"这个压缩包中,包含了Apache CXF 3.1.8...

    apache-cxf-2.5.3.tar.gz

    10. **文档和社区支持**:Apache CXF有一个活跃的社区,提供详尽的文档、示例和论坛支持,帮助开发者解决问题和学习如何使用框架。 在解压"apache-cxf-2.5.3.tar.gz"后,你将得到包含源代码、编译好的JAR文件、示例...

Global site tag (gtag.js) - Google Analytics