在项目中使用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);
}
}

解决Apache CXF 不支持传递java.sql.Timestamp和java.util.HashMap类型问题的更多相关文章

  1. mybatis invalid comparison: java.sql.Timestamp and java.lang.String报错解决方法

    这个错的意思是:java.sql.Timestamp和java.lang.String无效的比较 错误的原因是:拿传入的时间类型参数与空字符串进行比较就会报这个异常 解决方法:只保留非null判断就可 ...

  2. 关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题。

    转:关于如何处理JSONObject.fromObject(Object obj)无法转换特殊日期(java.sql.Date,java.sql.Timestamp)格式的问题. 关于JSONObje ...

  3. java.sql.Date和java.util.Date的不同和相互转换方式

    一:前言 这是我在新的公司写的第一份博客吧,来了又一个星期了吧,但是在来的那几天我真的很迷茫的感觉这里是很不适合我的样子,而且我又是来实习的,我很不愿意啊,自己做的又是java web,最原始的ser ...

  4. java.sql.Timestamp类型

    如果想向数据库中插入日期时间的话,可以用java.sql.Timestamp类 一个与 java.util.Date类有关的瘦包装器 (thin wrapper),它允许 JDBC API 将该类标识 ...

  5. JAVA中java.util.Date、java.sql.Timestamp和String之间的互相转换

    java.util.Date与的String互转 java.util.Date---->String /** * 将java.util.Date对象转化为String字符串 * @param d ...

  6. java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp小结

    java.lang.Object ....|__java.util.Date ..........|__java.sql.Date/java.sql.Timestamp /java.sql.Time ...

  7. java.sql.Date和java.sql.Timestamp转换

    转自:https://www.xuebuyuan.com/1479399.html 在开发web应用中,针对不同的数据库日期类型,我们需要在我们的程序中对日期类型做各种不同的转换.若对应数据库数据是o ...

  8. 报错 java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp 原因

    sql异常 java.sql.SQLException: Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestam ...

  9. mysql解决Value ‘0000-00-00 00:00:00’ can not be represented as java.sql.Timestamp

    同步发布:http://www.yuanrengu.com/index.php/mysqlsolvetimestamp.html 在使用mysql时,如果数据库中的字段类型是timestamp,默认为 ...

随机推荐

  1. http://www.zhihu.com/question/24896283

    http://www.zhihu.com/question/24896283 Rix Tox,太不專業了 三百.知乎用户.raintorr 等人赞同 1. 更改变量名的几种方法这种情况下该如何快速选中 ...

  2. docker的四种网络模式

    /* 1. host模式 : docker run 使用 --net=host指定 docker使用的网络实际上和宿主机一样 2. container模式: 使用 --net=container:co ...

  3. ASP.NET小知识

    所有System.Web.UI.*命名空间下的内容可以称为Web From,而System.Web.*命名空间下的其他内容可以称为ASP.NET. @section用法:配合母版页中的@RenderS ...

  4. linux shell脚本守护进程监控svn服务

    最近搭建的svn服务不知道什么原因服务总是被关闭(如果你不知道怎么搭建svn可以参考linux下搭建svn版本控制软件),因此用shell脚本实现一个守护进程.用于监控svn服务是否启动,如果服务不在 ...

  5. 1.前端笔记之html

    title: 1.前端笔记之HTML date: 2016-04-04 23:21:52 tags: Python categories: Python --- 作者:刘耀 **出处:http://w ...

  6. HDU 2147 kiki's game(博弈)

    kiki's game Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %I64d & %I64u Submit S ...

  7. MFC RadioButton

    添加一组RadioButton 多个radio button,IDC_RADIO1,IDC_RADIO2,IDC_RADIO3 ..将IDC_RADIO1的Group属性选择上,其他不要选Group属 ...

  8. CentOS 6.5 下安装 Kibana5

    1. 导入Elastic PGP Key 执行命令 rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch 2. 安装Kiban ...

  9. C# Winform 文件编码批量转换工具

    在发布产品程序包时,往往需要对程序文件进行编码检查,写了一个可以批量修改文件编码格式的辅助工具,希望对有同样需求的童鞋有帮助. 1.程序界面: 2.核心代码: /// <summary> ...

  10. wp8 入门到精通 线程

    Dispatcher.BeginInvoke(() => MessageBox.Show(String.Format("A push notification {0} error oc ...