在项目中使用Apache开源的Services Framework CXF来发布WebService,CXF能够很简洁与Spring Framework 集成在一起,在发布WebService的过程中,发布的接口的入参有些类型支持不是很好,比如Timestamp和Map。这个时候我们就需要编写一些适配来实行类型转换。
Timestamp:
1
/** *//**
2
* <java.sql.Timestamp类型转换>
3
* <功能详细描述>
4
*
5
* @author Owen
6
* @version [版本号, 2010-11-26]
7
* @see [相关类/方法]
8
* @since [产品/模块版本]
9
*/
10
public class TimestampAdapter extends XmlAdapter<String, Timestamp>
11

{
12
/** *//** <一句话功能简述>
13
* <功能详细描述>
14
* @param time
15
* @return
16
* @throws Exception
17
* @see [类、类#方法、类#成员]
18
*/
19
public String marshal(Timestamp time)
20
throws Exception
21
{
22
return DateUtil.timestamp2Str(time);
23
}
24
25
/** *//** <一句话功能简述>
26
* <功能详细描述>
27
* @param v
28
* @throws Exception
29
* @see [类、类#方法、类#成员]
30
*/
31
public Timestamp unmarshal(String str)
32
throws Exception
33
{
34
return DateUtil.str2Timestamp(str);
35
}
36
37
}
DateUtil
1
/**//*
2
* 文 件 名: DateUtil.java
3
* 版 权: 4 Dream Co., Ltd. Copyright YYYY-YYYY, All rights reserved
4
* 描 述: <描述>
5
* 修 改 人: Owen
6
* 修改时间: 2010-11-5
7
* 跟踪单号: <跟踪单号>
8
* 修改单号: <修改单号>
9
* 修改内容: <修改内容>
10
*/
11
package com.osoft.portal.common.util.commons;
12
13
import java.sql.Timestamp;
14
import java.text.ParseException;
15
import java.text.SimpleDateFormat;
16
import java.util.Date;
17
18
import org.apache.log4j.Logger;
19
20
/** *//**
21
* <一句话功能简述>
22
* <功能详细描述>
23
*
24
* @author Owen
25
* @version [版本号, 2010-11-5]
26
* @see [相关类/方法]
27
* @since [产品/模块版本]
28
*/
29
public class DateUtil
30

{
31
/** *//**
32
* 注释内容
33
*/
34
private static final Logger log = Logger.getLogger(DateUtil.class);
35
36
/** *//**
37
* 默认日期格式
38
*/
39
private static final String DEFAULT_FORMAT = "yyyy-MM-dd HH:mm:ss";
40
41
/** *//** <默认构造函数>
42
*/
43
private DateUtil()
44
{
45
}
46
47
/** *//** <字符串转换成日期>
48
* <如果转换格式为空,则利用默认格式进行转换操作>
49
* @param str 字符串
50
* @param format 日期格式
51
* @return 日期
52
* @see [类、类#方法、类#成员]
53
*/
54
public static Date str2Date(String str, String format)
55
{
56
if (null == str || "".equals(str))
57
{
58
return null;
59
}
60
//如果没有指定字符串转换的格式,则用默认格式进行转换
61
if (null == format || "".equals(format))
62
{
63
format = DEFAULT_FORMAT;
64
}
65
SimpleDateFormat sdf = new SimpleDateFormat(format);
66
Date date = null;
67
try
68
{
69
date = sdf.parse(str);
70
return date;
71
}
72
catch (ParseException e)
73
{
74
log.error("Parse string to date error!String : " + str);
75
}
76
77
return null;
78
}
79
80
/** *//** <一句话功能简述>
81
* <功能详细描述>
82
* @param date 日期
83
* @param format 日期格式
84
* @return 字符串
85
* @see [类、类#方法、类#成员]
86
*/
87
public static String date2Str(Date date, String format)
88
{
89
if (null == date)
90
{
91
return null;
92
}
93
SimpleDateFormat sdf = new SimpleDateFormat(format);
94
return sdf.format(date);
95
}
96
97
/** *//** <时间戳转换为字符串>
98
* <功能详细描述>
99
* @param time
100
* @return
101
* @see [类、类#方法、类#成员]
102
*/
103
public static String timestamp2Str(Timestamp time)
104
{
105
Date date = new Date(time.getTime());
106
return date2Str(date, DEFAULT_FORMAT);
107
}
108
109
/** *//** <一句话功能简述>
110
* <功能详细描述>
111
* @param str
112
* @return
113
* @see [类、类#方法、类#成员]
114
*/
115
public static Timestamp str2Timestamp(String str)
116
{
117
Date date = str2Date(str, DEFAULT_FORMAT);
118
return new Timestamp(date.getTime());
119
}
120
}
121
在具体的Java Bean 中,通过@XmlJavaTypeAdapter注解来通知CXF进行类型转换,具体请看User中的属性registerDate的getter 和setter
1
package com.osoft.portal.system.model;
2
3
import java.io.Serializable;
4
import java.sql.Timestamp;
5
6
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
7
8
import com.osoft.portal.common.util.commons.DateUtil;
9
import com.osoft.portal.remote.convert.TimestampAdapter;
10
11
/** *//**
12
* <一句话功能简述>
13
* <功能详细描述>
14
*
15
* @author Owen
16
* @version [版本号, 2010-11-1]
17
* @see [相关类/方法]
18
* @since [产品/模块版本]
19
*/
20
public class User implements Serializable
21

{
22
private static final long serialVersionUID = -6449817937177158567L;
23
24
/** *//**
25
* 用户标示
26
*/
27
private long id;
28
29
/** *//**
30
* 登录账号
31
*/
32
private String username;
33
34
/** *//**
35
* 登录密码
36
*/
37
private String password;
38
39
/** *//**
40
* 真实姓名
41
*/
42
private String realName;
43
44
/** *//**
45
* 性别
46
*/
47
private String sex;
48
49
/** *//**
50
* 注册日期
51
*/
52
private Timestamp registerDate;
53
54
/** *//**
55
* 用户状态
56
*/
57
private String state;
58
59
/** *//** <默认构造函数>
60
*/
61
public User()
62
{
63
}
64
65
public long getId()
66
{
67
return id;
68
}
69
70
public void setId(long id)
71
{
72
this.id = id;
73
}
74
75
public String getUsername()
76
{
77
return username;
78
}
79
80
public void setUsername(String username)
81
{
82
this.username = username;
83
}
84
85
public String getPassword()
86
{
87
return password;
88
}
89
90
public void setPassword(String password)
91
{
92
this.password = password;
93
}
94
95
public String getRealName()
96
{
97
return realName;
98
}
99
100
public void setRealName(String realName)
101
{
102
this.realName = realName;
103
}
104
105
public String getSex()
106
{
107
return sex;
108
}
109
110
public void setSex(String sex)
111
{
112
this.sex = sex;
113
}
114
115
@XmlJavaTypeAdapter(TimestampAdapter.class)
116
public Timestamp getRegisterDate()
117
{
118
return registerDate;
119
}
120
121
public void setRegisterDate(@XmlJavaTypeAdapter(TimestampAdapter.class) Timestamp registerDate)
122
{
123
this.registerDate = registerDate;
124
}
125
126
public String getState()
127
{
128
return state;
129
}
130
131
public void setState(String state)
132
{
133
this.state = state;
134
}
135
136
/** *//** <一句话功能简述>
137
* <功能详细描述>
138
* @return
139
* @see [类、类#方法、类#成员]
140
*/
141
public String toString()
142
{
143
StringBuilder build = new StringBuilder();
144
build.append("Real Name: " + this.getRealName() + ",Register Date: "
145
+ DateUtil.timestamp2Str(this.getRegisterDate()));
146
return build.toString();
147
}
148
149
}
150
OK,这个时候CXF解析Java Bean User的时候,解析到@XmlJavaTypeAdapter注解时候就会以TimestampAdapter这个适配器来进行Timestamp与String之间的转换。
Map:
这里贴下上一个项目中java.util.Map写的转换器,参考javaeye上一个网友提示的,直接用xstream将Map转换成String
1
/** *//**
2
* <数据模型转换>
3
* <Map<String,Object> 与 String之间的转换>
4
*
5
* @author Owen
6
* @version [版本号, Apr 28, 2010]
7
* @see [相关类/方法]
8
* @since [产品/模块版本]
9
*/
10
@XmlType(name = "MapAdapter")
11
@XmlAccessorType(XmlAccessType.FIELD)
12
public class MapAdapter extends XmlAdapter<String, Map<String, Object>>
13

{
14
15
/** *//**
16
* Convert a bound type to a value type.
17
* 转换JAXB不支持的对象类型为JAXB支持的对象类型
18
*
19
* @param map map
20
* The value to be convereted. Can be null.
21
* @return String
22
* @throws Exception
23
* if there's an error during the conversion. The caller is responsible for
24
* reporting the error to the user through {@link javax.xml.bind.ValidationEventHandler}.
25
*/
26
public String marshal(Map<String, Object> map)
27
throws Exception
28
{
29
XStream xs = new XStream(new DomDriver());
30
return xs.toXML(map);
31
}
32
33
/** *//**
34
* Convert a value type to a bound type.
35
* 转换JAXB支持的对象类型为JAXB不支持的的类型
36
*
37
* @param model
38
* The value to be converted. Can be null.
39
* @return Map<String,Object>
40
* @throws Exception
41
* if there's an error during the conversion. The caller is responsible for
42
* reporting the error to the user through {@link javax.xml.bind.ValidationEventHandler}.
43
*/
44
@SuppressWarnings("unchecked")
45
public Map<String, Object> unmarshal(String model)
46
throws Exception
47
{
48
XStream xs = new XStream(new DomDriver());
49
return (HashMap)xs.fromXML(model);
50
}
51
52
}
posted on 2010-11-27 14:28
absolute 阅读(3416)
评论(1) 编辑 收藏