From b5913d11c271f98d5ead42f0eece56eaf1dfbc0e Mon Sep 17 00:00:00 2001 From: Calvin Date: Thu, 6 Dec 2012 00:59:19 +0800 Subject: [PATCH] =?UTF-8?q?#132=20DynamicSpecification=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E5=AF=B9=E8=BE=93=E5=85=A5=E5=8F=82=E6=95=B0=E5=81=9A=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2=EF=BC=8C=E5=9B=A0?= =?UTF-8?q?=E4=B8=BA=E6=95=B0=E5=AD=97=E7=9A=84=E8=AF=9DHibernate=E4=BC=9A?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=BD=AC=EF=BC=8C=E6=97=A5=E6=9C=9F=E7=9A=84?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=BE=88=E9=9A=BE=E8=87=AA=E5=8A=A8=E8=BD=AC?= =?UTF-8?q?=E3=80=82=E5=8F=A6=E5=AF=B9=E6=98=A8=E5=A4=A9=E7=9A=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=A2=9E=E5=8A=A0=E4=BA=86=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soap/AccountSoapServiceImpl.java | 8 ++++---- .../src/main/resources/applicationContext.xml | 6 +++--- .../webapp/WEB-INF/views/account/userList.jsp | 2 +- .../functional/account/UserManagerFT.java | 3 +++ .../showcase/functional/rest/UserJaxRsFT.java | 2 ++ .../showcase/functional/rest/UserRestFT.java | 3 ++- .../jpa/DynamicSpecificationTest.java | 18 ++++++++++++++---- .../application.functional.properties | 2 +- .../test/resources/application.test.properties | 1 - .../src/test/resources/data/import-data.sql | 2 +- .../persistence/DynamicSpecifications.java | 11 ----------- .../modules/persistence/SearchFilter.java | 18 ++++++++++++++---- .../modules/persistence/SearchFilterTest.java | 4 ++-- modules/parent/pom.xml | 4 ++-- 14 files changed, 49 insertions(+), 35 deletions(-) diff --git a/examples/showcase/src/main/java/org/springside/examples/showcase/webservice/soap/AccountSoapServiceImpl.java b/examples/showcase/src/main/java/org/springside/examples/showcase/webservice/soap/AccountSoapServiceImpl.java index 5053e22f..a40e2a0f 100644 --- a/examples/showcase/src/main/java/org/springside/examples/showcase/webservice/soap/AccountSoapServiceImpl.java +++ b/examples/showcase/src/main/java/org/springside/examples/showcase/webservice/soap/AccountSoapServiceImpl.java @@ -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) { diff --git a/examples/showcase/src/main/resources/applicationContext.xml b/examples/showcase/src/main/resources/applicationContext.xml index a7b0c8af..a84fda2e 100644 --- a/examples/showcase/src/main/resources/applicationContext.xml +++ b/examples/showcase/src/main/resources/applicationContext.xml @@ -80,8 +80,7 @@ + location="classpath*:/application.properties" /> @@ -129,7 +128,8 @@ + location="classpath*:/application.properties, + classpath*:/application.test.properties" /> diff --git a/examples/showcase/src/main/webapp/WEB-INF/views/account/userList.jsp b/examples/showcase/src/main/webapp/WEB-INF/views/account/userList.jsp index afba1828..57719870 100644 --- a/examples/showcase/src/main/webapp/WEB-INF/views/account/userList.jsp +++ b/examples/showcase/src/main/webapp/WEB-INF/views/account/userList.jsp @@ -28,7 +28,7 @@ - +
diff --git a/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/account/UserManagerFT.java b/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/account/UserManagerFT.java index 3edc5ba1..2e5cfe13 100644 --- a/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/account/UserManagerFT.java +++ b/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/account/UserManagerFT.java @@ -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 diff --git a/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserJaxRsFT.java b/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserJaxRsFT.java index befafa51..372634ec 100644 --- a/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserJaxRsFT.java +++ b/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserJaxRsFT.java @@ -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()); } } diff --git a/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserRestFT.java b/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserRestFT.java index eeaf7e14..f61f4d18 100644 --- a/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserRestFT.java +++ b/examples/showcase/src/test/functional/org/springside/examples/showcase/functional/rest/UserRestFT.java @@ -89,6 +89,7 @@ public class UserRestFT extends BaseFunctionalTestCase { HttpEntity 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); } - } } diff --git a/examples/showcase/src/test/java/org/springside/examples/showcase/repository/jpa/DynamicSpecificationTest.java b/examples/showcase/src/test/java/org/springside/examples/showcase/repository/jpa/DynamicSpecificationTest.java index b6d8cafa..25f88b13 100644 --- a/examples/showcase/src/test/java/org/springside/examples/showcase/repository/jpa/DynamicSpecificationTest.java +++ b/examples/showcase/src/test/java/org/springside/examples/showcase/repository/jpa/DynamicSpecificationTest.java @@ -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 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)); diff --git a/examples/showcase/src/test/resources/application.functional.properties b/examples/showcase/src/test/resources/application.functional.properties index 69454ae9..5422c6ff 100644 --- a/examples/showcase/src/test/resources/application.functional.properties +++ b/examples/showcase/src/test/resources/application.functional.properties @@ -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/showcase4-test;AUTO_SERVER=TRUE jdbc.username=sa jdbc.password= \ No newline at end of file diff --git a/examples/showcase/src/test/resources/application.test.properties b/examples/showcase/src/test/resources/application.test.properties index 8b137891..e69de29b 100644 --- a/examples/showcase/src/test/resources/application.test.properties +++ b/examples/showcase/src/test/resources/application.test.properties @@ -1 +0,0 @@ - diff --git a/examples/showcase/src/test/resources/data/import-data.sql b/examples/showcase/src/test/resources/data/import-data.sql index c375afc2..e719acba 100644 --- a/examples/showcase/src/test/resources/data/import-data.sql +++ b/examples/showcase/src/test/resources/data/import-data.sql @@ -1,4 +1,4 @@ -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); diff --git a/modules/core/src/main/java/org/springside/modules/persistence/DynamicSpecifications.java b/modules/core/src/main/java/org/springside/modules/persistence/DynamicSpecifications.java index 1835436e..9b2d5071 100644 --- a/modules/core/src/main/java/org/springside/modules/persistence/DynamicSpecifications.java +++ b/modules/core/src/main/java/org/springside/modules/persistence/DynamicSpecifications.java @@ -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 Specification bySearchFilter(final Collection filters, final Class clazz) { return new Specification() { @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: diff --git a/modules/core/src/main/java/org/springside/modules/persistence/SearchFilter.java b/modules/core/src/main/java/org/springside/modules/persistence/SearchFilter.java index ce04e430..d5fa3a63 100644 --- a/modules/core/src/main/java/org/springside/modules/persistence/SearchFilter.java +++ b/modules/core/src/main/java/org/springside/modules/persistence/SearchFilter.java @@ -23,21 +23,31 @@ public class SearchFilter { this.operator = operator; } + /** + * searchParams中key的格式为OPERATOR_FIELDNAME + */ public static Map parse(Map searchParams) { Map filters = Maps.newHashMap(); for (Entry 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; diff --git a/modules/core/src/test/java/org/springside/modules/persistence/SearchFilterTest.java b/modules/core/src/test/java/org/springside/modules/persistence/SearchFilterTest.java index 1064ce50..50c8cfb6 100644 --- a/modules/core/src/test/java/org/springside/modules/persistence/SearchFilterTest.java +++ b/modules/core/src/test/java/org/springside/modules/persistence/SearchFilterTest.java @@ -20,12 +20,12 @@ public class SearchFilterTest { Map 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); diff --git a/modules/parent/pom.xml b/modules/parent/pom.xml index 26e303bc..35706ebb 100644 --- a/modules/parent/pom.xml +++ b/modules/parent/pom.xml @@ -22,7 +22,7 @@ 5.7.0 2.1.6 2.6.2 - 2.8.7 + 2.8.9 4.3.1.Final 1.0.6 2.1.2 @@ -904,7 +904,7 @@ org.codehaus.mojo versions-maven-plugin - 1.3.1 + 2.0 -- GitLab
登录名