目录:
- 应用场景
- 实现方法
[一]、应用场景
在实际应用中,经常会碰到表单中的日期 字符串和Javabean中的日期类型的属性自动转换,一般页面输入的日志格式为:yyyy-MM-dd ,而SpringMVC中默认不支持这样的格式转换,所以需要我们自定义数据类型的绑定才能实现这个功能。
[二]、实现方法
利用 WebBindingInitializer 注册自定义日期转换控制器。
自定义日期转换器:MyDataBinding.java
1
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
|
package
com
.
micmiu
.
demo
.
web
.
v1
.
utils
;
import
java
.
text
.
SimpleDateFormat
;
import
org
.
springframework
.
beans
.
propertyeditors
.
CustomDateEditor
;
import
org
.
springframework
.
web
.
bind
.
WebDataBinder
;
import
org
.
springframework
.
web
.
bind
.
support
.
WebBindingInitializer
;
import
org
.
springframework
.
web
.
context
.
request
.
WebRequest
;
/**
* 自定义日期、时间的类型绑定
*
* @author <a href="http://www.micmiu.com">Michael Sun</a>
*/
public
class
MyDataBinding
implements
WebBindingInitializer
{
public
void
initBinder
(
WebDataBinder
binder
,
WebRequest
request
)
{
SimpleDateFormat
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
)
;
dateFormat
.
setLenient
(
false
)
;
SimpleDateFormat
datetimeFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
)
;
datetimeFormat
.
setLenient
(
false
)
;
binder
.
registerCustomEditor
(
java
.
util
.
Date
.
class
,
new
CustomDateEditor
(
dateFormat
,
true
)
)
;
binder
.
registerCustomEditor
(
java
.
sql
.
Timestamp
.
class
,
new
CustomTimestampEditor
(
datetimeFormat
,
true
)
)
;
}
}
|
Timestamp 的实现:CustomTimestampEditor.java
1
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
|
package
com
.
micmiu
.
demo
.
web
.
v1
.
utils
;
import
java
.
beans
.
PropertyEditorSupport
;
import
java
.
sql
.
Timestamp
;
import
java
.
text
.
SimpleDateFormat
;
import
org
.
springframework
.
util
.
StringUtils
;
import
java
.
text
.
ParseException
;
/**
* Property editor for <code>java.sql.Timestamp</code>,<br>
* supporting a custom <code>java.text.DateFormat</code>.
*
* @author <a href="http://www.micmiu.com">Michael Sun</a>
*/
public
class
CustomTimestampEditor
extends
PropertyEditorSupport
{
private
final
SimpleDateFormat
dateFormat
;
private
final
boolean
allowEmpty
;
private
final
int
exactDateLength
;
public
CustomTimestampEditor
(
SimpleDateFormat
dateFormat
,
boolean
allowEmpty
)
{
this
.
dateFormat
=
dateFormat
;
this
.
allowEmpty
=
allowEmpty
;
this
.
exactDateLength
=
-
1
;
}
public
CustomTimestampEditor
(
SimpleDateFormat
dateFormat
,
boolean
allowEmpty
,
int
exactDateLength
)
{
this
.
dateFormat
=
dateFormat
;
this
.
allowEmpty
=
allowEmpty
;
this
.
exactDateLength
=
exactDateLength
;
}
public
void
setAsText
(
String
text
)
throws
IllegalArgumentException
{
if
(
(
this
.
allowEmpty
)
&
amp
;
&
amp
;
(
!
(
StringUtils
.
hasText
(
text
)
)
)
)
{
setValue
(
null
)
;
}
else
{
if
(
(
text
!=
null
)
&
amp
;
&
amp
;
(
this
.
exactDateLength
&
gt
;
=
0
)
&
amp
;
&
amp
;
(
text
.
length
(
)
!=
this
.
exactDateLength
)
)
{
throw
new
IllegalArgumentException
(
"Could not parse date: it is not exactly"
+
this
.
exactDateLength
+
"characters long"
)
;
}
try
{
setValue
(
new
Timestamp
(
this
.
dateFormat
.
parse
(
text
)
.
getTime
(
)
)
)
;
}
catch
(
ParseException
ex
)
{
throw
new
IllegalArgumentException
(
"Could not parse date: "
+
ex
.
getMessage
(
)
,
ex
)
;
}
}
}
public
String
getAsText
(
)
{
Timestamp
value
=
(
Timestamp
)
getValue
(
)
;
return
(
(
value
!=
null
)
?
this
.
dateFormat
.
format
(
value
)
:
""
)
;
}
}
|
修改spring-mvc 的配置文件,添加 webBindingInitializer 属性的注入配置:
1
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
|
<!--Spring3.1 之后的自定义注解 HandlerAdapter -->
<bean
class
=
"org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
>
<property
name
=
"webBindingInitializer"
>
<bean
class
=
"com.micmiu.demo.web.v1.utils.MyDataBinding"
/>
</property>
<property
name
=
"messageConverters"
>
<list>
<bean
class
=
"org.springframework.http.converter.ByteArrayHttpMessageConverter"
/>
<bean
class
=
"org.springframework.http.converter.StringHttpMessageConverter"
>
<property
name
=
"writeAcceptCharset"
value
=
"false"
/>
<property
name
=
"supportedMediaTypes"
>
<list>
<value>
text/plain;charset=UTF-8
</value>
<value>
*/*;charset=UTF-8
</value>
</list>
</property>
</bean>
<bean
class
=
"org.springframework.http.converter.xml.SourceHttpMessageConverter"
/>
<bean
class
=
"org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"
/>
<bean
class
=
"org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"
>
</bean>
</list>
</property>
</bean>
|
这样就可以实现表单中的字符串自动转换为Date或者Timestamp 类型。