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 5053e22ff5d51717d689ac57f4c7d7dd74a6973e..a40e2a0f8db1bc8d4b7e808910caa01459b88851 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 a7b0c8af05084f38348f326cca46daf0c984da27..a84fda2ebe341b83e930daba09167e1d7d07fb45 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 afba1828eda1aa8b726acfcd92ba68560bb5e12e..577198707860f69e1b583059e975c3e80529d540 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 3edc5ba1f7c9e3b6ab86c00b945b7c7f59cf9555..2e5cfe137ce6587a736b142717cb647bba513802 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 befafa51c2abb4b5708b6f03be663b4800d04268..372634ec4003451993adf6dcbc625f5304286d8b 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 eeaf7e14ed11ef7518076baa39d8b5922c962566..f61f4d18fb8c4bf7f858c0bf4e41453db2f916c0 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 b6d8cafa13a08874a12e7fc5931ce7d231ef009a..25f88b13caf91805320ccc74051c2e5e539ea9fb 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 69454ae9821afd5629ddcdad226334c3bee58521..5422c6ff3ebe8075561f4ac1559f9ed78c7e99cd 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 8b137891791fe96927ad78e64b0aad7bded08bdc..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 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 c375afc2fb3bd915d0df7994bd640b7993a9d553..e719acbafe1109ce5919008b07a8e6e8b1d1dbf2 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 1835436e467de84729ffca1a13aa66cbcb4dd484..9b2d50719601258894e714e129212ce0b548ab20 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 ce04e430b4aa9afdd1bf73fde4a7099a443fd43c..d5fa3a637293e3d4d895ce95ce11b25e609ce3a3 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 1064ce50dff1dcc5948dc6423d839f5aac818256..50c8cfb6f63af02fdf6b35ce80c208c15d46cfac 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 26e303bc4ad8f3ad65a788117aadb53c88bddb96..35706ebb822bdbd18c5720ee7b434390d106f6eb 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
登录名