diff --git a/samples/common/src/main/java/com/supwisdom/leaveschool/common/controller/api/CrudApiController.java b/samples/common/src/main/java/com/supwisdom/leaveschool/common/controller/api/CrudApiController.java
index b9474e8..0f32960 100644
--- a/samples/common/src/main/java/com/supwisdom/leaveschool/common/controller/api/CrudApiController.java
+++ b/samples/common/src/main/java/com/supwisdom/leaveschool/common/controller/api/CrudApiController.java
@@ -1,8 +1,5 @@
 package com.supwisdom.leaveschool.common.controller.api;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import org.springframework.data.domain.Page;
 import org.springframework.http.HttpStatus;
 import org.springframework.util.MimeTypeUtils;
@@ -18,6 +15,7 @@
 import com.supwisdom.leaveschool.common.domain.ABaseDomain;
 import com.supwisdom.leaveschool.common.model.PagerRequestModel;
 import com.supwisdom.leaveschool.common.model.PagerResponseModel;
+import com.supwisdom.leaveschool.common.model.SuccessResponseModel;
 import com.supwisdom.leaveschool.common.repository.BaseJpaRepository;
 import com.supwisdom.leaveschool.common.util.DomainUtils;
 
@@ -184,13 +182,13 @@
   @PostMapping(consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseStatus(value = HttpStatus.OK)
   @ResponseBody
-  public Map<String, Object> create(@RequestBody D d) {
+  public SuccessResponseModel create(@RequestBody D d) {
     
     @SuppressWarnings("unused")
     D ret = getRepository().insert(d);
     
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.create.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.create.success");
     
     return res;
   }
@@ -250,7 +248,7 @@
   @PutMapping(consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseStatus(value = HttpStatus.OK)
   @ResponseBody
-  public Map<String, Object> update(@RequestBody D d) {
+  public SuccessResponseModel update(@RequestBody D d) {
     
     if (d.getId() == null || d.getId().length() == 0) {
       throw new RuntimeException("exception.update.id.must.not.empty");  // FIXME: RestException
@@ -267,8 +265,8 @@
     D ret = getRepository().update(tmp);
     getRepository().flush();
     
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.update.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.update.success");
     
     return res;
   }
@@ -310,7 +308,7 @@
   @DeleteMapping(path = "/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseStatus(value = HttpStatus.OK)
   @ResponseBody
-  public Map<String, Object> delete(@PathVariable("id") String id) {
+  public SuccessResponseModel delete(@PathVariable("id") String id) {
     
     if (id == null || id.length() == 0) {
       throw new RuntimeException("exception.delete.id.must.not.empty");  // FIXME: RestException
@@ -323,8 +321,8 @@
     
     getRepository().delete(tmp);
     
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.delete.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.delete.success");
     
     return res;
   }
diff --git a/samples/common/src/main/java/com/supwisdom/leaveschool/common/model/SuccessResponseModel.java b/samples/common/src/main/java/com/supwisdom/leaveschool/common/model/SuccessResponseModel.java
new file mode 100644
index 0000000..750e55c
--- /dev/null
+++ b/samples/common/src/main/java/com/supwisdom/leaveschool/common/model/SuccessResponseModel.java
@@ -0,0 +1,22 @@
+package com.supwisdom.leaveschool.common.model;
+
+import java.io.Serializable;
+
+public class SuccessResponseModel implements Serializable {
+
+  /**
+   * 
+   */
+  private static final long serialVersionUID = 280042050835200337L;
+  
+  private String success;
+
+  public String getSuccess() {
+    return success;
+  }
+
+  public void setSuccess(String success) {
+    this.success = success;
+  }
+
+}
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminGroupController.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminGroupController.java
index 745eb94..518dfd0 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminGroupController.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminGroupController.java
@@ -1,10 +1,7 @@
 package com.supwisdom.leaveschool.user.controller.api.admin;
 
 import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
-import org.apache.commons.collections.IteratorUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.util.MimeTypeUtils;
@@ -18,6 +15,7 @@
 import com.supwisdom.leaveschool.common.controller.api.CrudApiController;
 import com.supwisdom.leaveschool.common.model.PagerRequestModel;
 import com.supwisdom.leaveschool.common.model.PagerResponseModel;
+import com.supwisdom.leaveschool.common.model.SuccessResponseModel;
 import com.supwisdom.leaveschool.user.domain.Group;
 import com.supwisdom.leaveschool.user.domain.GroupRole;
 import com.supwisdom.leaveschool.user.domain.GroupUser;
@@ -79,13 +77,10 @@
     Page<GroupUser> page = groupUserRepository.selectGroupUsers(pagerRequestModel.getPageIndex(),
         pagerRequestModel.getPageSize(), pagerRequestModel.getMapBean());
 
-    @SuppressWarnings("unchecked")
-    List<GroupUser> list = IteratorUtils.toList(page.iterator());
-
     PagerResponseModel<GroupUser> pagerResponseModel = PagerResponseModel.of(pagerRequestModel);
     pagerResponseModel.setPageCount(page.getTotalPages());
     pagerResponseModel.setRecordCount(page.getTotalElements());
-    pagerResponseModel.setItems(list);
+    pagerResponseModel.setItems(page.getContent());
 
     return pagerResponseModel;
   }
@@ -102,7 +97,7 @@
    */
   @RequestMapping(value = "/{id}/users", method = RequestMethod.POST, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseBody
-  public Map<String, Object> relateUsers(@PathVariable("id") String id, @RequestBody GroupUsers groupUsers) {
+  public SuccessResponseModel relateUsers(@PathVariable("id") String id, @RequestBody GroupUsers groupUsers) {
 
     if (id == null || id.length() == 0) {
       throw new RuntimeException("exception.get.id.must.not.empty"); // FIXME: RestException
@@ -116,8 +111,8 @@
 
     groupUserRepository.relateGroupUsers(group, groupUsers.getGroupUsers());
 
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.set.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.set.success");
 
     return res;
   }
@@ -156,13 +151,10 @@
     Page<GroupRole> page = groupRoleRepository.selectGroupRoles(pagerRequestModel.getPageIndex(),
         pagerRequestModel.getPageSize(), pagerRequestModel.getMapBean());
 
-    @SuppressWarnings("unchecked")
-    List<GroupRole> list = IteratorUtils.toList(page.iterator());
-
     PagerResponseModel<GroupRole> pagerResponseModel = PagerResponseModel.of(pagerRequestModel);
     pagerResponseModel.setPageCount(page.getTotalPages());
     pagerResponseModel.setRecordCount(page.getTotalElements());
-    pagerResponseModel.setItems(list);
+    pagerResponseModel.setItems(page.getContent());
 
     return pagerResponseModel;
   }
@@ -179,7 +171,7 @@
    */
   @RequestMapping(value = "/{id}/roles", method = RequestMethod.POST, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseBody
-  public Map<String, Object> relateRoles(@PathVariable("id") String id, @RequestBody GroupRoles groupRoles) {
+  public SuccessResponseModel relateRoles(@PathVariable("id") String id, @RequestBody GroupRoles groupRoles) {
 
     if (id == null || id.length() == 0) {
       throw new RuntimeException("exception.get.id.must.not.empty"); // FIXME: RestException
@@ -193,8 +185,8 @@
 
     groupRoleRepository.relateGroupRoles(group, groupRoles.getGroupRoles());
 
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.set.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.set.success");
 
     return res;
   }
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminPermissionController.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminPermissionController.java
index 6ebc5fe..2f63f1b 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminPermissionController.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminPermissionController.java
@@ -1,10 +1,7 @@
 package com.supwisdom.leaveschool.user.controller.api.admin;
 
 import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
-import org.apache.commons.collections.IteratorUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.util.MimeTypeUtils;
@@ -18,6 +15,7 @@
 import com.supwisdom.leaveschool.common.controller.api.CrudApiController;
 import com.supwisdom.leaveschool.common.model.PagerRequestModel;
 import com.supwisdom.leaveschool.common.model.PagerResponseModel;
+import com.supwisdom.leaveschool.common.model.SuccessResponseModel;
 import com.supwisdom.leaveschool.user.domain.Permission;
 import com.supwisdom.leaveschool.user.domain.RolePermission;
 import com.supwisdom.leaveschool.user.model.RolePermissions;
@@ -73,13 +71,10 @@
     Page<RolePermission> page = permissionRoleRepository.selectRolePermissions(pagerRequestModel.getPageIndex(),
         pagerRequestModel.getPageSize(), pagerRequestModel.getMapBean());
 
-    @SuppressWarnings("unchecked")
-    List<RolePermission> list = IteratorUtils.toList(page.iterator());
-
     PagerResponseModel<RolePermission> pagerResponseModel = PagerResponseModel.of(pagerRequestModel);
     pagerResponseModel.setPageCount(page.getTotalPages());
     pagerResponseModel.setRecordCount(page.getTotalElements());
-    pagerResponseModel.setItems(list);
+    pagerResponseModel.setItems(page.getContent());
 
     return pagerResponseModel;
   }
@@ -96,7 +91,7 @@
    */
   @RequestMapping(value = "/{id}/roles", method = RequestMethod.POST, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseBody
-  public Map<String, Object> relateRoles(@PathVariable("id") String id, @RequestBody RolePermissions rolePermissions) {
+  public SuccessResponseModel relateRoles(@PathVariable("id") String id, @RequestBody RolePermissions rolePermissions) {
 
     if (id == null || id.length() == 0) {
       throw new RuntimeException("exception.get.id.must.not.empty"); // FIXME: RestException
@@ -110,8 +105,8 @@
 
     permissionRoleRepository.relatePermissionRoles(permission, rolePermissions.getRolePermissions());
 
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.set.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.set.success");
 
     return res;
   }
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminRoleController.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminRoleController.java
index 60a94ab..a51fc96 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminRoleController.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminRoleController.java
@@ -1,10 +1,7 @@
 package com.supwisdom.leaveschool.user.controller.api.admin;
 
 import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
-import org.apache.commons.collections.IteratorUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.util.MimeTypeUtils;
@@ -18,6 +15,7 @@
 import com.supwisdom.leaveschool.common.controller.api.CrudApiController;
 import com.supwisdom.leaveschool.common.model.PagerRequestModel;
 import com.supwisdom.leaveschool.common.model.PagerResponseModel;
+import com.supwisdom.leaveschool.common.model.SuccessResponseModel;
 import com.supwisdom.leaveschool.user.domain.GroupRole;
 import com.supwisdom.leaveschool.user.domain.Role;
 import com.supwisdom.leaveschool.user.domain.RolePermission;
@@ -79,13 +77,10 @@
     Page<UserRole> page = userRoleRepository.selectUserRoles(pagerRequestModel.getPageIndex(),
         pagerRequestModel.getPageSize(), pagerRequestModel.getMapBean());
 
-    @SuppressWarnings("unchecked")
-    List<UserRole> list = IteratorUtils.toList(page.iterator());
-
     PagerResponseModel<UserRole> pagerResponseModel = PagerResponseModel.of(pagerRequestModel);
     pagerResponseModel.setPageCount(page.getTotalPages());
     pagerResponseModel.setRecordCount(page.getTotalElements());
-    pagerResponseModel.setItems(list);
+    pagerResponseModel.setItems(page.getContent());
 
     return pagerResponseModel;
   }
@@ -102,7 +97,7 @@
    */
   @RequestMapping(value = "/{id}/users", method = RequestMethod.POST, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseBody
-  public Map<String, Object> relateUsers(@PathVariable("id") String id, @RequestBody UserRoles userRoles) {
+  public SuccessResponseModel relateUsers(@PathVariable("id") String id, @RequestBody UserRoles userRoles) {
 
     if (id == null || id.length() == 0) {
       throw new RuntimeException("exception.get.id.must.not.empty"); // FIXME: RestException
@@ -116,8 +111,8 @@
 
     userRoleRepository.relateRoleUsers(role, userRoles.getUserRoles());
 
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.set.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.set.success");
 
     return res;
   }
@@ -162,13 +157,10 @@
     Page<GroupRole> page = groupRoleRepository.selectGroupRoles(pagerRequestModel.getPageIndex(),
         pagerRequestModel.getPageSize(), pagerRequestModel.getMapBean());
 
-    @SuppressWarnings("unchecked")
-    List<GroupRole> list = IteratorUtils.toList(page.iterator());
-
     PagerResponseModel<GroupRole> pagerResponseModel = PagerResponseModel.of(pagerRequestModel);
     pagerResponseModel.setPageCount(page.getTotalPages());
     pagerResponseModel.setRecordCount(page.getTotalElements());
-    pagerResponseModel.setItems(list);
+    pagerResponseModel.setItems(page.getContent());
 
     return pagerResponseModel;
   }
@@ -185,7 +177,7 @@
    */
   @RequestMapping(value = "/{id}/groups", method = RequestMethod.POST, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseBody
-  public Map<String, Object> relateGroups(@PathVariable("id") String id, @RequestBody GroupRoles groupRoles) {
+  public SuccessResponseModel relateGroups(@PathVariable("id") String id, @RequestBody GroupRoles groupRoles) {
 
     if (id == null || id.length() == 0) {
       throw new RuntimeException("exception.get.id.must.not.empty"); // FIXME: RestException
@@ -199,8 +191,8 @@
 
     groupRoleRepository.relateRoleGroups(role, groupRoles.getGroupRoles());
 
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.set.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.set.success");
 
     return res;
   }
@@ -244,13 +236,10 @@
     Page<RolePermission> page = rolePermissionRepository.selectRolePermissions(pagerRequestModel.getPageIndex(),
         pagerRequestModel.getPageSize(), pagerRequestModel.getMapBean());
 
-    @SuppressWarnings("unchecked")
-    List<RolePermission> list = IteratorUtils.toList(page.iterator());
-
     PagerResponseModel<RolePermission> pagerResponseModel = PagerResponseModel.of(pagerRequestModel);
     pagerResponseModel.setPageCount(page.getTotalPages());
     pagerResponseModel.setRecordCount(page.getTotalElements());
-    pagerResponseModel.setItems(list);
+    pagerResponseModel.setItems(page.getContent());
 
     return pagerResponseModel;
   }
@@ -267,7 +256,7 @@
    */
   @RequestMapping(value = "/{id}/permissons", method = RequestMethod.POST, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseBody
-  public Map<String, Object> relatePermissions(@PathVariable("id") String id, @RequestBody RolePermissions rolePermissions) {
+  public SuccessResponseModel relatePermissions(@PathVariable("id") String id, @RequestBody RolePermissions rolePermissions) {
 
     if (id == null || id.length() == 0) {
       throw new RuntimeException("exception.get.id.must.not.empty"); // FIXME: RestException
@@ -281,8 +270,8 @@
 
     rolePermissionRepository.relateRolePermissions(role, rolePermissions.getRolePermissions());
 
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.set.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.set.success");
 
     return res;
   }
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminUserController.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminUserController.java
index e18015b..2e9ca21 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminUserController.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/admin/Api1AdminUserController.java
@@ -1,10 +1,7 @@
 package com.supwisdom.leaveschool.user.controller.api.admin;
 
 import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 
-import org.apache.commons.collections.IteratorUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.http.HttpStatus;
@@ -25,6 +22,7 @@
 import com.supwisdom.leaveschool.common.controller.api.CrudApiController;
 import com.supwisdom.leaveschool.common.model.PagerRequestModel;
 import com.supwisdom.leaveschool.common.model.PagerResponseModel;
+import com.supwisdom.leaveschool.common.model.SuccessResponseModel;
 import com.supwisdom.leaveschool.common.util.DomainUtils;
 import com.supwisdom.leaveschool.user.domain.GroupUser;
 import com.supwisdom.leaveschool.user.domain.User;
@@ -248,7 +246,7 @@
   @PostMapping(consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseStatus(value = HttpStatus.OK)
   @ResponseBody
-  public Map<String, Object> create(@RequestBody User user) {
+  public SuccessResponseModel create(@RequestBody User user) {
     
     // FIXME: 验证数据有效性
     
@@ -259,8 +257,8 @@
     @SuppressWarnings("unused")
     User ret = userRepository.insert(user);
 
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.create.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.create.success");
 
     return res;
   }
@@ -329,7 +327,7 @@
   @PutMapping(consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseStatus(value = HttpStatus.OK)
   @ResponseBody
-  public Map<String, Object> update(@RequestBody User user) {
+  public SuccessResponseModel update(@RequestBody User user) {
 
     if (user.getId() == null || user.getId().length() == 0) {
       throw new RuntimeException("exception.update.id.must.not.empty"); // FIXME: RestException
@@ -350,8 +348,8 @@
     User ret = userRepository.update(tmp);
     userRepository.flush();
 
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.update.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.update.success");
 
     return res;
   }
@@ -400,7 +398,7 @@
   @DeleteMapping(path = "/{id}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseStatus(value = HttpStatus.OK)
   @ResponseBody
-  public Map<String, Object> delete(@PathVariable("id") String id) {
+  public SuccessResponseModel delete(@PathVariable("id") String id) {
 
     if (id == null || id.length() == 0) {
       throw new RuntimeException("exception.delete.id.must.not.empty"); // FIXME: RestException
@@ -413,8 +411,8 @@
 
     userRepository.delete(tmp);
 
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.delete.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.delete.success");
 
     return res;
   }
@@ -453,13 +451,10 @@
     Page<GroupUser> page = groupUserRepository.selectGroupUsers(pagerRequestModel.getPageIndex(),
         pagerRequestModel.getPageSize(), pagerRequestModel.getMapBean());
 
-    @SuppressWarnings("unchecked")
-    List<GroupUser> list = IteratorUtils.toList(page.iterator());
-
     PagerResponseModel<GroupUser> pagerResponseModel = PagerResponseModel.of(pagerRequestModel);
     pagerResponseModel.setPageCount(page.getTotalPages());
     pagerResponseModel.setRecordCount(page.getTotalElements());
-    pagerResponseModel.setItems(list);
+    pagerResponseModel.setItems(page.getContent());
 
     return pagerResponseModel;
   }
@@ -476,7 +471,7 @@
    */
   @RequestMapping(value = "/{id}/groups", method = RequestMethod.POST, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseBody
-  public Map<String, Object> relateGroups(@PathVariable("id") String id, @RequestBody GroupUsers groupUsers) {
+  public SuccessResponseModel relateGroups(@PathVariable("id") String id, @RequestBody GroupUsers groupUsers) {
 
     if (id == null || id.length() == 0) {
       throw new RuntimeException("exception.get.id.must.not.empty"); // FIXME: RestException
@@ -490,8 +485,8 @@
 
     groupUserRepository.relateUserGroups(user, groupUsers.getGroupUsers());
 
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.set.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.set.success");
 
     return res;
   }
@@ -530,13 +525,10 @@
     Page<UserRole> page = userRoleRepository.selectUserRoles(pagerRequestModel.getPageIndex(),
         pagerRequestModel.getPageSize(), pagerRequestModel.getMapBean());
 
-    @SuppressWarnings("unchecked")
-    List<UserRole> list = IteratorUtils.toList(page.iterator());
-
     PagerResponseModel<UserRole> pagerResponseModel = PagerResponseModel.of(pagerRequestModel);
     pagerResponseModel.setPageCount(page.getTotalPages());
     pagerResponseModel.setRecordCount(page.getTotalElements());
-    pagerResponseModel.setItems(list);
+    pagerResponseModel.setItems(page.getContent());
 
     return pagerResponseModel;
   }
@@ -553,7 +545,7 @@
    */
   @RequestMapping(value = "/{id}/roles", method = RequestMethod.POST, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   @ResponseBody
-  public Map<String, Object> relateRoles(@PathVariable("id") String id, @RequestBody UserRoles userRoles) {
+  public SuccessResponseModel relateRoles(@PathVariable("id") String id, @RequestBody UserRoles userRoles) {
 
     if (id == null || id.length() == 0) {
       throw new RuntimeException("exception.get.id.must.not.empty"); // FIXME: RestException
@@ -567,8 +559,8 @@
 
     userRoleRepository.relateUserRoles(user, userRoles.getUserRoles());
 
-    Map<String, Object> res = new HashMap<String, Object>();
-    res.put("success", "info.set.success");
+    SuccessResponseModel res = new SuccessResponseModel();
+    res.setSuccess("info.set.success");
 
     return res;
   }
