在項目中使用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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

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
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52
