Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
带水的鱼儿
spring-framework
提交
4fe3ca1b
S
spring-framework
项目概览
带水的鱼儿
/
spring-framework
与 Fork 源项目一致
从无法访问的项目Fork
通知
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,发现更多精彩内容 >>
提交
4fe3ca1b
编写于
7月 09, 2021
作者:
J
Juergen Hoeller
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
DataClassRowMapper suppresses setter method calls for constructor-bound properties
Closes gh-26569
上级
c45c46da
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
181 addition
and
15 deletion
+181
-15
spring-jdbc/src/main/java/org/springframework/jdbc/core/BeanPropertyRowMapper.java
.../org/springframework/jdbc/core/BeanPropertyRowMapper.java
+28
-15
spring-jdbc/src/main/java/org/springframework/jdbc/core/DataClassRowMapper.java
...ava/org/springframework/jdbc/core/DataClassRowMapper.java
+3
-0
spring-jdbc/src/test/java/org/springframework/jdbc/core/DataClassRowMapperTests.java
...rg/springframework/jdbc/core/DataClassRowMapperTests.java
+17
-0
spring-jdbc/src/test/java/org/springframework/jdbc/core/test/ConstructorPersonWithSetters.java
...ramework/jdbc/core/test/ConstructorPersonWithSetters.java
+76
-0
spring-jdbc/src/test/kotlin/org/springframework/jdbc/core/KotlinDataClassRowMapperTests.kt
...pringframework/jdbc/core/KotlinDataClassRowMapperTests.kt
+57
-0
未找到文件。
spring-jdbc/src/main/java/org/springframework/jdbc/core/BeanPropertyRowMapper.java
浏览文件 @
4fe3ca1b
...
...
@@ -225,16 +225,40 @@ public class BeanPropertyRowMapper<T> implements RowMapper<T> {
for
(
PropertyDescriptor
pd
:
BeanUtils
.
getPropertyDescriptors
(
mappedClass
))
{
if
(
pd
.
getWriteMethod
()
!=
null
)
{
this
.
mappedFields
.
put
(
lowerCaseName
(
pd
.
getName
()),
pd
);
String
underscoredName
=
underscoreName
(
pd
.
getName
());
if
(!
lowerCaseName
(
pd
.
getName
()).
equals
(
underscoredName
))
{
this
.
mappedFields
.
put
(
underscoredName
,
pd
);
String
lowerCaseName
=
lowerCaseName
(
pd
.
getName
());
this
.
mappedFields
.
put
(
lowerCaseName
,
pd
);
String
underscoreName
=
underscoreName
(
pd
.
getName
());
if
(!
lowerCaseName
.
equals
(
underscoreName
))
{
this
.
mappedFields
.
put
(
underscoreName
,
pd
);
}
this
.
mappedProperties
.
add
(
pd
.
getName
());
}
}
}
/**
* Remove the specified property from the mapped fields.
* @param propertyName the property name (as used by property descriptors)
* @since 5.3.9
*/
protected
void
suppressProperty
(
String
propertyName
)
{
if
(
this
.
mappedFields
!=
null
)
{
this
.
mappedFields
.
remove
(
lowerCaseName
(
propertyName
));
this
.
mappedFields
.
remove
(
underscoreName
(
propertyName
));
}
}
/**
* Convert the given name to lower case.
* By default, conversions will happen within the US locale.
* @param name the original name
* @return the converted name
* @since 4.2
*/
protected
String
lowerCaseName
(
String
name
)
{
return
name
.
toLowerCase
(
Locale
.
US
);
}
/**
* Convert a name in camelCase to an underscored name in lower case.
* Any upper case letters are converted to lower case with a preceding underscore.
...
...
@@ -261,17 +285,6 @@ public class BeanPropertyRowMapper<T> implements RowMapper<T> {
return
result
.
toString
();
}
/**
* Convert the given name to lower case.
* By default, conversions will happen within the US locale.
* @param name the original name
* @return the converted name
* @since 4.2
*/
protected
String
lowerCaseName
(
String
name
)
{
return
name
.
toLowerCase
(
Locale
.
US
);
}
/**
* Extract the values for all columns in the current row.
...
...
spring-jdbc/src/main/java/org/springframework/jdbc/core/DataClassRowMapper.java
浏览文件 @
4fe3ca1b
...
...
@@ -80,6 +80,9 @@ public class DataClassRowMapper<T> extends BeanPropertyRowMapper<T> {
int
paramCount
=
this
.
mappedConstructor
.
getParameterCount
();
if
(
paramCount
>
0
)
{
this
.
constructorParameterNames
=
BeanUtils
.
getParameterNames
(
this
.
mappedConstructor
);
for
(
String
name
:
this
.
constructorParameterNames
)
{
suppressProperty
(
name
);
}
this
.
constructorParameterTypes
=
new
TypeDescriptor
[
paramCount
];
for
(
int
i
=
0
;
i
<
paramCount
;
i
++)
{
this
.
constructorParameterTypes
[
i
]
=
new
TypeDescriptor
(
new
MethodParameter
(
this
.
mappedConstructor
,
i
));
...
...
spring-jdbc/src/test/java/org/springframework/jdbc/core/DataClassRowMapperTests.java
浏览文件 @
4fe3ca1b
...
...
@@ -25,6 +25,7 @@ import org.junit.jupiter.api.Test;
import
org.springframework.jdbc.core.test.ConstructorPerson
;
import
org.springframework.jdbc.core.test.ConstructorPersonWithGenerics
;
import
org.springframework.jdbc.core.test.ConstructorPersonWithSetters
;
import
static
org
.
assertj
.
core
.
api
.
Assertions
.
assertThat
;
...
...
@@ -62,4 +63,20 @@ public class DataClassRowMapperTests extends AbstractRowMapperTests {
mock
.
verifyClosed
();
}
@Test
public
void
testStaticQueryWithDataClassAndSetters
()
throws
Exception
{
Mock
mock
=
new
Mock
();
List
<
ConstructorPersonWithSetters
>
result
=
mock
.
getJdbcTemplate
().
query
(
"select name, age, birth_date, balance from people"
,
new
DataClassRowMapper
<>(
ConstructorPersonWithSetters
.
class
));
assertThat
(
result
.
size
()).
isEqualTo
(
1
);
ConstructorPersonWithSetters
person
=
result
.
get
(
0
);
assertThat
(
person
.
name
()).
isEqualTo
(
"BUBBA"
);
assertThat
(
person
.
age
()).
isEqualTo
(
22L
);
assertThat
(
person
.
birth_date
()).
usingComparator
(
Date:
:
compareTo
).
isEqualTo
(
new
java
.
util
.
Date
(
1221222L
));
assertThat
(
person
.
balance
()).
isEqualTo
(
new
BigDecimal
(
"1234.56"
));
mock
.
verifyClosed
();
}
}
spring-jdbc/src/test/java/org/springframework/jdbc/core/test/ConstructorPersonWithSetters.java
0 → 100644
浏览文件 @
4fe3ca1b
/*
* Copyright 2002-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.springframework.jdbc.core.test
;
import
java.math.BigDecimal
;
import
java.util.Date
;
/**
* @author Juergen Hoeller
*/
public
class
ConstructorPersonWithSetters
{
private
String
name
;
private
long
age
;
private
Date
birth_date
;
private
BigDecimal
balance
;
public
ConstructorPersonWithSetters
(
String
name
,
long
age
,
Date
birth_date
,
BigDecimal
balance
)
{
this
.
name
=
name
.
toUpperCase
();
this
.
age
=
age
;
this
.
birth_date
=
birth_date
;
this
.
balance
=
balance
;
}
public
void
setName
(
String
name
)
{
this
.
name
=
name
;
}
public
void
setAge
(
long
age
)
{
this
.
age
=
age
;
}
public
void
setBirth_date
(
Date
birth_date
)
{
this
.
birth_date
=
birth_date
;
}
public
void
setBalance
(
BigDecimal
balance
)
{
this
.
balance
=
balance
;
}
public
String
name
()
{
return
this
.
name
;
}
public
long
age
()
{
return
this
.
age
;
}
public
Date
birth_date
()
{
return
this
.
birth_date
;
}
public
BigDecimal
balance
()
{
return
this
.
balance
;
}
}
spring-jdbc/src/test/kotlin/org/springframework/jdbc/core/KotlinDataClassRowMapperTests.kt
0 → 100644
浏览文件 @
4fe3ca1b
/*
* Copyright 2002-2021 the original author or authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org.springframework.jdbc.core
import
org.assertj.core.api.Assertions
import
org.junit.jupiter.api.Test
import
org.springframework.jdbc.core.test.ConstructorPerson
import
java.math.BigDecimal
import
java.util.*
class
KotlinDataClassRowMapperTests
:
AbstractRowMapperTests
()
{
@Test
fun
testStaticQueryWithDataClass
()
{
val
mock
=
Mock
()
val
result
=
mock
.
jdbcTemplate
.
query
(
"select name, age, birth_date, balance from people"
,
DataClassRowMapper
(
ConstructorPerson
::
class
.
java
)
)
Assertions
.
assertThat
(
result
.
size
).
isEqualTo
(
1
)
verifyPerson
(
result
[
0
])
mock
.
verifyClosed
()
}
@Test
fun
testInitPropertiesAreNotOverridden
()
{
val
mock
=
Mock
()
val
result
=
mock
.
jdbcTemplate
.
query
(
"select name, age, birth_date, balance from people"
,
DataClassRowMapper
(
KotlinPerson
::
class
.
java
)
)
Assertions
.
assertThat
(
result
.
size
).
isEqualTo
(
1
)
Assertions
.
assertThat
(
result
[
0
].
name
).
isEqualTo
(
"Bubba appended by init"
)
}
data class
KotlinPerson
(
var
name
:
String
,
val
age
:
Long
,
val
birth_date
:
Date
,
val
balance
:
BigDecimal
)
{
init
{
name
+=
" appended by init"
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录