Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
爱吃血肠
spring-framework
提交
1480202a
S
spring-framework
项目概览
爱吃血肠
/
spring-framework
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
spring-framework
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1480202a
编写于
9月 11, 2009
作者:
R
Rob Harrop
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[SPR-5644] Support for Enum<?> and Enum<T> values as FQN.FIELD_NAME in type conversion
上级
f7562614
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
91 addition
and
12 deletion
+91
-12
org.springframework.beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java
...java/org/springframework/beans/TypeConverterDelegate.java
+48
-12
org.springframework.beans/src/test/java/org/springframework/beans/BeanWrapperTests.java
...test/java/org/springframework/beans/BeanWrapperTests.java
+43
-0
未找到文件。
org.springframework.beans/src/main/java/org/springframework/beans/TypeConverterDelegate.java
浏览文件 @
1480202a
...
...
@@ -232,18 +232,8 @@ class TypeConverterDelegate {
// It's an empty enum identifier: reset the enum value to null.
return
null
;
}
// Try field lookup as fallback: for JDK 1.5 enum or custom enum
// with values defined as static fields. Resulting value still needs
// to be checked, hence we don't return it right away.
try
{
Field
enumField
=
requiredType
.
getField
(
trimmedValue
);
convertedValue
=
enumField
.
get
(
null
);
}
catch
(
Throwable
ex
)
{
if
(
logger
.
isTraceEnabled
())
{
logger
.
trace
(
"Field ["
+
convertedValue
+
"] isn't an enum value"
,
ex
);
}
}
convertedValue
=
attemptToConvertStringToEnum
(
requiredType
,
trimmedValue
,
convertedValue
);
}
}
...
...
@@ -270,6 +260,52 @@ class TypeConverterDelegate {
return
(
T
)
convertedValue
;
}
private
Object
attemptToConvertStringToEnum
(
Class
<?>
requiredType
,
String
trimmedValue
,
Object
currentConvertedValue
)
{
Object
convertedValue
=
currentConvertedValue
;
if
(
Enum
.
class
.
equals
(
requiredType
))
{
// target type is declared as raw enum, treat the trimmed value as <enum.fqn>.FIELD_NAME
int
index
=
trimmedValue
.
lastIndexOf
(
"."
);
if
(
index
>
-
1
)
{
String
enumType
=
trimmedValue
.
substring
(
0
,
index
);
String
fieldName
=
trimmedValue
.
substring
(
index
+
1
);
ClassLoader
loader
=
this
.
targetObject
.
getClass
().
getClassLoader
();
try
{
Class
<?>
enumValueType
=
loader
.
loadClass
(
enumType
);
Field
enumField
=
enumValueType
.
getField
(
fieldName
);
convertedValue
=
enumField
.
get
(
null
);
}
catch
(
ClassNotFoundException
ex
)
{
if
(
logger
.
isTraceEnabled
())
{
logger
.
trace
(
"Enum class ["
+
enumType
+
"] cannot be loaded from ["
+
loader
+
"]"
,
ex
);
}
}
catch
(
Throwable
ex
)
{
if
(
logger
.
isTraceEnabled
())
{
logger
.
trace
(
"Field ["
+
fieldName
+
"] isn't an enum value for type ["
+
enumType
+
"]"
,
ex
);
}
}
}
}
if
(
convertedValue
==
currentConvertedValue
)
{
// Try field lookup as fallback: for JDK 1.5 enum or custom enum
// with values defined as static fields. Resulting value still needs
// to be checked, hence we don't return it right away.
try
{
Field
enumField
=
requiredType
.
getField
(
trimmedValue
);
convertedValue
=
enumField
.
get
(
null
);
}
catch
(
Throwable
ex
)
{
if
(
logger
.
isTraceEnabled
())
{
logger
.
trace
(
"Field ["
+
convertedValue
+
"] isn't an enum value"
,
ex
);
}
}
}
return
convertedValue
;
}
/**
* Find a default editor for the given type.
* @param requiredType the type to find an editor for
...
...
org.springframework.beans/src/test/java/org/springframework/beans/BeanWrapperTests.java
浏览文件 @
1480202a
...
...
@@ -1462,6 +1462,21 @@ public final class BeanWrapperTests {
}
}
@Test
public
void
testGenericEnum
()
{
EnumConsumer
consumer
=
new
EnumConsumer
();
BeanWrapper
bw
=
new
BeanWrapperImpl
(
consumer
);
bw
.
setPropertyValue
(
"enumValue"
,
TestEnum
.
class
.
getName
()
+
".TEST_VALUE"
);
assertEquals
(
TestEnum
.
TEST_VALUE
,
consumer
.
getEnumValue
());
}
@Test
public
void
testWildcardedGenericEnum
()
{
WildcardEnumConsumer
consumer
=
new
WildcardEnumConsumer
();
BeanWrapper
bw
=
new
BeanWrapperImpl
(
consumer
);
bw
.
setPropertyValue
(
"enumValue"
,
TestEnum
.
class
.
getName
()
+
".TEST_VALUE"
);
assertEquals
(
TestEnum
.
TEST_VALUE
,
consumer
.
getEnumValue
());
}
private
static
class
DifferentTestBean
extends
TestBean
{
// class to test naming of beans in a BeanWrapper error message
...
...
@@ -1747,4 +1762,32 @@ public final class BeanWrapperTests {
}
}
public
static
class
EnumConsumer
{
private
Enum
<
TestEnum
>
enumValue
;
public
Enum
<
TestEnum
>
getEnumValue
()
{
return
enumValue
;
}
public
void
setEnumValue
(
Enum
<
TestEnum
>
enumValue
)
{
this
.
enumValue
=
enumValue
;
}
}
public
static
class
WildcardEnumConsumer
{
private
Enum
<?>
enumValue
;
public
Enum
<?>
getEnumValue
()
{
return
enumValue
;
}
public
void
setEnumValue
(
Enum
<?>
enumValue
)
{
this
.
enumValue
=
enumValue
;
}
}
public
enum
TestEnum
{
TEST_VALUE
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录