Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
后端镜像
java镜像
Springside4
提交
b5913d11
S
Springside4
项目概览
后端镜像
/
java镜像
/
Springside4
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Springside4
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
b5913d11
编写于
12月 06, 2012
作者:
C
Calvin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
#132 DynamicSpecification不再对输入参数做自动类型转换,因为数字的话Hibernate会自动转,日期的格式很难自动转。另对昨天的修改增加了测试用例
上级
0c6d2341
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
49 addition
and
35 deletion
+49
-35
examples/showcase/src/main/java/org/springside/examples/showcase/webservice/soap/AccountSoapServiceImpl.java
...ples/showcase/webservice/soap/AccountSoapServiceImpl.java
+4
-4
examples/showcase/src/main/resources/applicationContext.xml
examples/showcase/src/main/resources/applicationContext.xml
+3
-3
examples/showcase/src/main/webapp/WEB-INF/views/account/userList.jsp
...owcase/src/main/webapp/WEB-INF/views/account/userList.jsp
+1
-1
examples/showcase/src/test/functional/org/springside/examples/showcase/functional/account/UserManagerFT.java
...e/examples/showcase/functional/account/UserManagerFT.java
+3
-0
examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserJaxRsFT.java
...ngside/examples/showcase/functional/rest/UserJaxRsFT.java
+2
-0
examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserRestFT.java
...ingside/examples/showcase/functional/rest/UserRestFT.java
+2
-1
examples/showcase/src/test/java/org/springside/examples/showcase/repository/jpa/DynamicSpecificationTest.java
...les/showcase/repository/jpa/DynamicSpecificationTest.java
+14
-4
examples/showcase/src/test/resources/application.functional.properties
...case/src/test/resources/application.functional.properties
+1
-1
examples/showcase/src/test/resources/application.test.properties
...s/showcase/src/test/resources/application.test.properties
+0
-1
examples/showcase/src/test/resources/data/import-data.sql
examples/showcase/src/test/resources/data/import-data.sql
+1
-1
modules/core/src/main/java/org/springside/modules/persistence/DynamicSpecifications.java
...springside/modules/persistence/DynamicSpecifications.java
+0
-11
modules/core/src/main/java/org/springside/modules/persistence/SearchFilter.java
...java/org/springside/modules/persistence/SearchFilter.java
+14
-4
modules/core/src/test/java/org/springside/modules/persistence/SearchFilterTest.java
.../org/springside/modules/persistence/SearchFilterTest.java
+2
-2
modules/parent/pom.xml
modules/parent/pom.xml
+2
-2
未找到文件。
examples/showcase/src/main/java/org/springside/examples/showcase/webservice/soap/AccountSoapServiceImpl.java
浏览文件 @
b5913d11
...
...
@@ -45,7 +45,7 @@ public class AccountSoapServiceImpl implements AccountSoapService {
private
Validator
validator
;
/**
* @see AccountSoapService#getTeamDetail()
* @see AccountSoapService#getTeamDetail(
Long
)
*/
@Override
public
GetTeamDetailResult
getTeamDetail
(
Long
id
)
{
...
...
@@ -70,7 +70,7 @@ public class AccountSoapServiceImpl implements AccountSoapService {
}
/**
* @see AccountSoapService#getUser()
* @see AccountSoapService#getUser(
Long
)
*/
@Override
public
GetUserResult
getUser
(
Long
id
)
{
...
...
@@ -96,7 +96,7 @@ public class AccountSoapServiceImpl implements AccountSoapService {
}
/**
* @see AccountSoapService#searchUser()
* @see AccountSoapService#searchUser(
String, String
)
*/
@Override
public
SearchUserResult
searchUser
(
String
loginName
,
String
name
)
{
...
...
@@ -113,7 +113,7 @@ public class AccountSoapServiceImpl implements AccountSoapService {
}
/**
* @see AccountSoapService#createUser()
* @see AccountSoapService#createUser(
UserDTO
)
*/
@Override
public
IdResult
createUser
(
UserDTO
user
)
{
...
...
examples/showcase/src/main/resources/applicationContext.xml
浏览文件 @
b5913d11
...
...
@@ -80,8 +80,7 @@
<!-- production环境 -->
<beans
profile=
"production"
>
<context:property-placeholder
ignore-resource-not-found=
"true"
location=
"classpath*:/application.properties,
classpath*:/application.local.properties"
/>
location=
"classpath*:/application.properties"
/>
<!-- 数据源配置,使用应用内的DBCP数据库连接池 -->
<bean
id=
"dataSource"
class=
"org.apache.commons.dbcp.BasicDataSource"
destroy-method=
"close"
>
...
...
@@ -129,7 +128,8 @@
<!-- unit test环境 -->
<beans
profile=
"test"
>
<context:property-placeholder
ignore-resource-not-found=
"true"
location=
"classpath*:/application.properties"
/>
location=
"classpath*:/application.properties,
classpath*:/application.test.properties"
/>
<!-- 嵌入式内存中数据库 -->
<jdbc:embedded-database
id=
"dataSource"
type=
"H2"
>
...
...
examples/showcase/src/main/webapp/WEB-INF/views/account/userList.jsp
浏览文件 @
b5913d11
...
...
@@ -28,7 +28,7 @@
</div>
</div>
<table
class=
"table table-striped table-bordered table-condensed"
>
<table
id=
"contentTable"
class=
"table table-striped table-bordered table-condensed"
>
<thead>
<tr>
<th>
登录名
</th>
...
...
examples/showcase/src/test/functional/org/springside/examples/showcase/functional/account/UserManagerFT.java
浏览文件 @
b5913d11
...
...
@@ -5,6 +5,7 @@ import static org.junit.Assert.*;
import
org.junit.Test
;
import
org.junit.experimental.categories.Category
;
import
org.openqa.selenium.By
;
import
org.openqa.selenium.WebElement
;
import
org.springside.examples.showcase.functional.BaseSeleniumTestCase
;
import
org.springside.modules.test.category.Smoke
;
...
...
@@ -22,6 +23,8 @@ public class UserManagerFT extends BaseSeleniumTestCase {
s
.
click
(
By
.
linkText
(
"帐号管理"
));
loginAsAdminIfNecessary
();
assertEquals
(
"Showcase示例:综合演示用例"
,
s
.
getTitle
());
WebElement
table
=
s
.
findElement
(
By
.
id
(
"contentTable"
));
assertEquals
(
"管理员 "
,
s
.
getTable
(
table
,
0
,
1
));
}
@Test
...
...
examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserJaxRsFT.java
浏览文件 @
b5913d11
...
...
@@ -28,10 +28,12 @@ public class UserJaxRsFT extends BaseFunctionalTestCase {
public
void
getUser
()
{
UserDTO
user
=
restTemplate
.
getForObject
(
resoureUrl
+
"/{id}.json"
,
UserDTO
.
class
,
1L
);
assertEquals
(
"admin"
,
user
.
getLoginName
());
assertEquals
(
"管理员"
,
user
.
getName
());
assertEquals
(
new
Long
(
1
),
user
.
getTeamId
());
user
=
restTemplate
.
getForObject
(
resoureUrl
+
"/{id}.xml"
,
UserDTO
.
class
,
1L
);
assertEquals
(
"admin"
,
user
.
getLoginName
());
assertEquals
(
"管理员"
,
user
.
getName
());
assertEquals
(
new
Long
(
1
),
user
.
getTeamId
());
}
}
examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserRestFT.java
浏览文件 @
b5913d11
...
...
@@ -89,6 +89,7 @@ public class UserRestFT extends BaseFunctionalTestCase {
HttpEntity
<
UserDTO
>
response
=
jdkTemplate
.
exchange
(
resoureUrl
+
"/{id}.xml"
,
HttpMethod
.
GET
,
requestEntity
,
UserDTO
.
class
,
1L
);
assertEquals
(
"admin"
,
response
.
getBody
().
getLoginName
());
assertEquals
(
"管理员"
,
response
.
getBody
().
getName
());
assertEquals
(
new
Long
(
1
),
response
.
getBody
().
getTeamId
());
}
...
...
@@ -101,6 +102,7 @@ public class UserRestFT extends BaseFunctionalTestCase {
public
void
getUserAsJson
()
{
UserDTO
user
=
httpClientRestTemplate
.
getForObject
(
resoureUrl
+
"/{id}.json"
,
UserDTO
.
class
,
1L
);
assertEquals
(
"admin"
,
user
.
getLoginName
());
assertEquals
(
"管理员"
,
user
.
getName
());
assertEquals
(
new
Long
(
1
),
user
.
getTeamId
());
}
...
...
@@ -143,6 +145,5 @@ public class UserRestFT extends BaseFunctionalTestCase {
Servlets
.
encodeHttpBasic
(
user
,
password
));
return
execution
.
execute
(
request
,
body
);
}
}
}
examples/showcase/src/test/java/org/springside/examples/showcase/repository/jpa/DynamicSpecificationTest.java
浏览文件 @
b5913d11
...
...
@@ -24,16 +24,17 @@ public class DynamicSpecificationTest extends SpringTransactionalTestCase {
@Test
public
void
fineUserByFilter
()
{
// EQ
SearchFilter
filter
=
new
SearchFilter
(
"name"
,
Operator
.
EQ
,
"
Admin
"
);
SearchFilter
filter
=
new
SearchFilter
(
"name"
,
Operator
.
EQ
,
"
管理员
"
);
List
<
User
>
users
=
userDao
.
findAll
(
DynamicSpecifications
.
bySearchFilter
(
Lists
.
newArrayList
(
filter
),
User
.
class
));
assertEquals
(
1
,
users
.
size
());
// LIKE
filter
=
new
SearchFilter
(
"loginName"
,
Operator
.
LIKE
,
"min"
);
users
=
userDao
.
findAll
(
DynamicSpecifications
.
bySearchFilter
(
Lists
.
newArrayList
(
filter
),
User
.
class
));
assertEquals
(
1
,
users
.
size
());
// GT
filter
=
new
SearchFilter
(
"id"
,
Operator
.
GT
,
"1"
);
users
=
userDao
.
findAll
(
DynamicSpecifications
.
bySearchFilter
(
Lists
.
newArrayList
(
filter
),
User
.
class
));
...
...
@@ -42,6 +43,7 @@ public class DynamicSpecificationTest extends SpringTransactionalTestCase {
filter
=
new
SearchFilter
(
"id"
,
Operator
.
GT
,
"6"
);
users
=
userDao
.
findAll
(
DynamicSpecifications
.
bySearchFilter
(
Lists
.
newArrayList
(
filter
),
User
.
class
));
assertEquals
(
0
,
users
.
size
());
// GTE
filter
=
new
SearchFilter
(
"id"
,
Operator
.
GTE
,
"1"
);
users
=
userDao
.
findAll
(
DynamicSpecifications
.
bySearchFilter
(
Lists
.
newArrayList
(
filter
),
User
.
class
));
...
...
@@ -59,6 +61,7 @@ public class DynamicSpecificationTest extends SpringTransactionalTestCase {
filter
=
new
SearchFilter
(
"id"
,
Operator
.
LT
,
"1"
);
users
=
userDao
.
findAll
(
DynamicSpecifications
.
bySearchFilter
(
Lists
.
newArrayList
(
filter
),
User
.
class
));
assertEquals
(
0
,
users
.
size
());
// LTE
filter
=
new
SearchFilter
(
"id"
,
Operator
.
LTE
,
"6"
);
users
=
userDao
.
findAll
(
DynamicSpecifications
.
bySearchFilter
(
Lists
.
newArrayList
(
filter
),
User
.
class
));
...
...
@@ -76,16 +79,23 @@ public class DynamicSpecificationTest extends SpringTransactionalTestCase {
assertEquals
(
6
,
users
.
size
());
// AND 2 Conditions
SearchFilter
filter1
=
new
SearchFilter
(
"name"
,
Operator
.
EQ
,
"
Admin
"
);
SearchFilter
filter1
=
new
SearchFilter
(
"name"
,
Operator
.
EQ
,
"
管理员
"
);
SearchFilter
filter2
=
new
SearchFilter
(
"loginName"
,
Operator
.
LIKE
,
"min"
);
users
=
userDao
.
findAll
(
DynamicSpecifications
.
bySearchFilter
(
Lists
.
newArrayList
(
filter1
,
filter2
),
User
.
class
));
assertEquals
(
1
,
users
.
size
());
filter1
=
new
SearchFilter
(
"name"
,
Operator
.
EQ
,
"
Admin
"
);
filter1
=
new
SearchFilter
(
"name"
,
Operator
.
EQ
,
"
管理员
"
);
filter2
=
new
SearchFilter
(
"loginName"
,
Operator
.
LIKE
,
"user"
);
users
=
userDao
.
findAll
(
DynamicSpecifications
.
bySearchFilter
(
Lists
.
newArrayList
(
filter1
,
filter2
),
User
.
class
));
assertEquals
(
0
,
users
.
size
());
// 2 conditions on same field
filter1
=
new
SearchFilter
(
"id"
,
Operator
.
GTE
,
"1"
);
filter2
=
new
SearchFilter
(
"id"
,
Operator
.
LTE
,
"6"
);
users
=
userDao
.
findAll
(
DynamicSpecifications
.
bySearchFilter
(
Lists
.
newArrayList
(
filter1
,
filter2
),
User
.
class
));
assertEquals
(
6
,
users
.
size
());
// Nest Attribute
filter
=
new
SearchFilter
(
"team.id"
,
Operator
.
EQ
,
"1"
);
users
=
userDao
.
findAll
(
DynamicSpecifications
.
bySearchFilter
(
Lists
.
newArrayList
(
filter
),
User
.
class
));
...
...
examples/showcase/src/test/resources/application.functional.properties
浏览文件 @
b5913d11
...
...
@@ -5,6 +5,6 @@ selenium.driver=firefox
#(optional)override jdbc url for functional test
jdbc.driver
=
org.h2.Driver
jdbc.url
=
jdbc:h2:file:~/.h2/showcase-test;AUTO_SERVER=TRUE
jdbc.url
=
jdbc:h2:file:~/.h2/showcase
4
-test;AUTO_SERVER=TRUE
jdbc.username
=
sa
jdbc.password
=
\ No newline at end of file
examples/showcase/src/test/resources/application.test.properties
浏览文件 @
b5913d11
examples/showcase/src/test/resources/data/import-data.sql
浏览文件 @
b5913d11
insert
into
ss_user
(
id
,
login_name
,
name
,
email
,
password
,
salt
,
status
,
team_id
)
values
(
1
,
'admin'
,
'
Admin
'
,
'admin@springside.org.cn'
,
'691b14d79bf0fa2215f155235df5e670b64394cc'
,
'7efbd59d9741d34f'
,
'enabled'
,
1
);
insert
into
ss_user
(
id
,
login_name
,
name
,
email
,
password
,
salt
,
status
,
team_id
)
values
(
1
,
'admin'
,
'
管理员
'
,
'admin@springside.org.cn'
,
'691b14d79bf0fa2215f155235df5e670b64394cc'
,
'7efbd59d9741d34f'
,
'enabled'
,
1
);
insert
into
ss_user
(
id
,
login_name
,
name
,
email
,
password
,
salt
,
status
,
team_id
)
values
(
2
,
'user'
,
'Calvin'
,
'user@springside.org.cn'
,
'2488aa0c31c624687bd9928e0a5d29e7d1ed520b'
,
'6d65d24122c30500'
,
'enabled'
,
1
);
insert
into
ss_user
(
id
,
login_name
,
name
,
email
,
password
,
salt
,
status
,
team_id
)
values
(
3
,
'user2'
,
'Jack'
,
'jack@springside.org.cn'
,
'2488aa0c31c624687bd9928e0a5d29e7d1ed520b'
,
'6d65d24122c30500'
,
'enabled'
,
1
);
insert
into
ss_user
(
id
,
login_name
,
name
,
email
,
password
,
salt
,
status
,
team_id
)
values
(
4
,
'user3'
,
'Kate'
,
'kate@springside.org.cn'
,
'2488aa0c31c624687bd9928e0a5d29e7d1ed520b'
,
'6d65d24122c30500'
,
'enabled'
,
1
);
...
...
modules/core/src/main/java/org/springside/modules/persistence/DynamicSpecifications.java
浏览文件 @
b5913d11
...
...
@@ -10,16 +10,12 @@ import javax.persistence.criteria.Predicate;
import
javax.persistence.criteria.Root
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.core.convert.ConversionService
;
import
org.springframework.core.convert.support.DefaultConversionService
;
import
org.springframework.data.jpa.domain.Specification
;
import
org.springside.modules.utils.Collections3
;
import
com.google.common.collect.Lists
;
public
class
DynamicSpecifications
{
private
static
final
ConversionService
conversionService
=
new
DefaultConversionService
();
public
static
<
T
>
Specification
<
T
>
bySearchFilter
(
final
Collection
<
SearchFilter
>
filters
,
final
Class
<
T
>
clazz
)
{
return
new
Specification
<
T
>()
{
@Override
...
...
@@ -35,13 +31,6 @@ public class DynamicSpecifications {
expression
=
expression
.
get
(
names
[
i
]);
}
// convert value from string to target type
Class
attributeClass
=
expression
.
getJavaType
();
if
(!
attributeClass
.
equals
(
String
.
class
)
&&
filter
.
value
instanceof
String
&&
conversionService
.
canConvert
(
String
.
class
,
attributeClass
))
{
filter
.
value
=
conversionService
.
convert
(
filter
.
value
,
attributeClass
);
}
// logic operator
switch
(
filter
.
operator
)
{
case
EQ:
...
...
modules/core/src/main/java/org/springside/modules/persistence/SearchFilter.java
浏览文件 @
b5913d11
...
...
@@ -23,21 +23,31 @@ public class SearchFilter {
this
.
operator
=
operator
;
}
/**
* searchParams中key的格式为OPERATOR_FIELDNAME
*/
public
static
Map
<
String
,
SearchFilter
>
parse
(
Map
<
String
,
Object
>
searchParams
)
{
Map
<
String
,
SearchFilter
>
filters
=
Maps
.
newHashMap
();
for
(
Entry
<
String
,
Object
>
entry
:
searchParams
.
entrySet
())
{
// 过滤掉空值
String
key
=
entry
.
getKey
();
Object
value
=
entry
.
getValue
();
if
(
StringUtils
.
isBlank
((
String
)
value
))
{
continue
;
}
String
[]
names
=
StringUtils
.
split
(
entry
.
getKey
(),
"_"
);
// 拆分operator与filedAttribute
String
[]
names
=
StringUtils
.
split
(
key
,
"_"
);
if
(
names
.
length
!=
2
)
{
throw
new
IllegalArgumentException
(
entry
.
getKey
()
+
" is not a valid search filter name"
);
throw
new
IllegalArgumentException
(
key
+
" is not a valid search filter name"
);
}
SearchFilter
filter
=
new
SearchFilter
(
names
[
1
],
Operator
.
valueOf
(
names
[
0
]),
value
);
filters
.
put
(
entry
.
getKey
(),
filter
);
String
filedName
=
names
[
1
];
Operator
operator
=
Operator
.
valueOf
(
names
[
0
]);
// 创建searchFilter
SearchFilter
filter
=
new
SearchFilter
(
filedName
,
operator
,
value
);
filters
.
put
(
key
,
filter
);
}
return
filters
;
...
...
modules/core/src/test/java/org/springside/modules/persistence/SearchFilterTest.java
浏览文件 @
b5913d11
...
...
@@ -20,12 +20,12 @@ public class SearchFilterTest {
Map
<
String
,
SearchFilter
>
filters
=
SearchFilter
.
parse
(
params
);
SearchFilter
nameFilter
=
filters
.
get
(
"name"
);
SearchFilter
nameFilter
=
filters
.
get
(
"
EQ_
name"
);
assertEquals
(
Operator
.
EQ
,
nameFilter
.
operator
);
assertEquals
(
"name"
,
nameFilter
.
fieldName
);
assertEquals
(
"foo"
,
nameFilter
.
value
);
SearchFilter
ageFilter
=
filters
.
get
(
"age"
);
SearchFilter
ageFilter
=
filters
.
get
(
"
LT_
age"
);
assertEquals
(
Operator
.
LT
,
ageFilter
.
operator
);
assertEquals
(
"age"
,
ageFilter
.
fieldName
);
assertEquals
(
"1"
,
ageFilter
.
value
);
...
...
modules/parent/pom.xml
浏览文件 @
b5913d11
...
...
@@ -22,7 +22,7 @@
<activemq.version>
5.7.0
</activemq.version>
<quartz.version>
2.1.6
</quartz.version>
<ehcache.version>
2.6.2
</ehcache.version>
<spymemcached.version>
2.8.
7
</spymemcached.version>
<spymemcached.version>
2.8.
9
</spymemcached.version>
<hibernate-validator.version>
4.3.1.Final
</hibernate-validator.version>
<jolokia.version>
1.0.6
</jolokia.version>
<jackson.version>
2.1.2
</jackson.version>
...
...
@@ -904,7 +904,7 @@
<plugin>
<groupId>
org.codehaus.mojo
</groupId>
<artifactId>
versions-maven-plugin
</artifactId>
<version>
1.3.1
</version>
<version>
2.0
</version>
</plugin>
<!-- ant插件 -->
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录