自定义Jpa Repository 公共方法实现
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/config/BaseJpaRepositoryFactoryBean.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/config/BaseJpaRepositoryFactoryBean.java
new file mode 100644
index 0000000..647ba16
--- /dev/null
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/config/BaseJpaRepositoryFactoryBean.java
@@ -0,0 +1,52 @@
+package com.supwisdom.leaveschool.user.config;
+
+import javax.persistence.EntityManager;
+
+import org.springframework.data.jpa.repository.support.JpaRepositoryFactory;
+import org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean;
+import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
+import org.springframework.data.repository.core.RepositoryInformation;
+import org.springframework.data.repository.core.RepositoryMetadata;
+import org.springframework.data.repository.core.support.RepositoryFactorySupport;
+
+import com.supwisdom.leaveschool.user.domain.ABaseDomain;
+import com.supwisdom.leaveschool.user.repository.ABaseJpaRepositoryImpl;
+
+public class BaseJpaRepositoryFactoryBean<T extends ABaseJpaRepositoryImpl<S>, S extends ABaseDomain> extends JpaRepositoryFactoryBean<T, S, String> {
+
+  public BaseJpaRepositoryFactoryBean(Class<? extends T> repositoryInterface) {
+    super(repositoryInterface);
+  }
+
+  @SuppressWarnings("rawtypes")
+  protected RepositoryFactorySupport createRepositoryFactory(EntityManager em) {
+    return new BaseJpaRepositoryFactory(em);
+  }
+
+  private static class BaseJpaRepositoryFactory<T extends ABaseDomain> extends JpaRepositoryFactory {
+
+    private final EntityManager em;
+
+    public BaseJpaRepositoryFactory(EntityManager em) {
+      super(em);
+      this.em = em;
+    }
+
+    protected SimpleJpaRepository<T, String> getTargetRepository(RepositoryInformation information, EntityManager em) {
+      Class<T> domainClass = (Class<T>) information.getDomainType();
+      
+      return new ABaseJpaRepositoryImpl<T>(domainClass, em);
+    }
+
+//    @SuppressWarnings("unchecked")
+//    protected Object getTargetRepository(RepositoryMetadata metadata) {
+//      return new ABaseJpaRepositoryImpl<T>((Class<T>) metadata.getDomainType(), this.em);
+//    }
+
+    protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) {
+      return ABaseJpaRepositoryImpl.class;
+    }
+
+  }
+
+}
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/config/JpaDataConfig.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/config/JpaDataConfig.java
new file mode 100644
index 0000000..bf93feb
--- /dev/null
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/config/JpaDataConfig.java
@@ -0,0 +1,12 @@
+package com.supwisdom.leaveschool.user.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.data.web.config.EnableSpringDataWebSupport;
+
+//@Configuration
+//@EnableJpaRepositories(basePackages = "com.supwisdom.leaveschool.user.repository", repositoryFactoryBeanClass = BaseJpaRepositoryFactoryBean.class)
+//@EnableSpringDataWebSupport
+public class JpaDataConfig {
+
+}
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 3005491..36ab166 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
@@ -34,10 +34,10 @@
   
   /**
    * 
-   * curl -i -s -X GET -H 'Remote_User:admin' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users' 
-   * curl -i -s -X GET -H 'Remote_User:admin' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users?pageIndex=2&pageSize=50' 
-   * curl -i -s -X GET -H 'Remote_User:admin' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users?pageIndex=0&pageSize=20&mapBean[username]=username&mapBean[name]=name&mapBean[status]=1' 
-   * curl -i -s -X GET -H 'Remote_User:admin' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users?pageIndex=0&pageSize=20&mapBean[username]=username&mapBean[name]=name&mapBean[status]=0' 
+   * curl -i -s -X GET -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users' 
+   * curl -i -s -X GET -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users?pageIndex=2&pageSize=50' 
+   * curl -i -s -X GET -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users?pageIndex=0&pageSize=20&mapBean[username]=username&mapBean[name]=name&mapBean[status]=1' 
+   * curl -i -s -X GET -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users?pageIndex=0&pageSize=20&mapBean[username]=username&mapBean[name]=name&mapBean[status]=0' 
    * 
    * response success: 
    * 
@@ -99,7 +99,7 @@
   
   /**
    * 
-   * curl -i -s -X GET -H 'Remote_User:admin' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users/1' 
+   * curl -i -s -X GET -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users/1' 
    * 
    * response success: 
    * 
@@ -166,7 +166,7 @@
   
   /**
    * 
-   * curl -i -s -X POST -H 'Remote_User:admin' -H 'Content-Type:application/json' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users' \
+   * curl -i -s -X POST -H 'Content-Type:application/json' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users' \
    * -d '{"username":"test001","password":"test001","enabled":true,"accountNonExpired":true,"accountNonLocked":true,"credentialsNonExpired":true,"name":"测试001","status":"1"}'
    * 
    * response success: 
@@ -214,7 +214,7 @@
   
   /**
    * 
-   * curl -i -s -X PUT -H 'Remote_User:admin' -H 'Content-Type:application/json' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users' \
+   * curl -i -s -X PUT -H 'Content-Type:application/json' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users' \
    * -d '{"id":"1","status":"0"}'
    * 
    * response success:
@@ -233,7 +233,7 @@
    *   "path":"/api/v1/admin/users"
    * }
    * 
-   * curl -i -s -X PUT -H 'Remote_User:admin' -H 'Content-Type:application/json' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users' \
+   * curl -i -s -X PUT -H 'Content-Type:application/json' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users' \
    * -d '{"status":"0"}'
    * 
    * response error:
@@ -247,7 +247,7 @@
    *   "path":"/api/v1/admin/users"
    * }
    * 
-   * curl -i -s -X PUT -H 'Remote_User:admin' -H 'Content-Type:application/json' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users' \
+   * curl -i -s -X PUT -H 'Content-Type:application/json' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users' \
    * -d '{"id":"1","status":"0"}'
    * 
    * response error:
@@ -291,7 +291,7 @@
   
   /**
    * 
-   * curl -i -s -X DELETE -H 'Remote_User:admin' -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users/1'
+   * curl -i -s -X DELETE -H 'Accept:application/json' 'http://localhost:10010/api/v1/admin/users/1'
    * 
    * response success: 
    * 
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/demo/ApiDemoUserController.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/demo/ApiDemoUserController.java
index 99c120a..8d776f4 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/demo/ApiDemoUserController.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/controller/api/demo/ApiDemoUserController.java
@@ -11,8 +11,6 @@
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import com.supwisdom.leaveschool.user.util.AuthUtil;
-
 @RestController
 @RequestMapping("/api/demo/users")
 public class ApiDemoUserController {
@@ -27,8 +25,6 @@
    */
   @GetMapping(path = "/greeting/{name}", produces = MimeTypeUtils.APPLICATION_JSON_VALUE)
   public Map<String, Object> greeting(@PathVariable("name") String name) {
-    AuthUtil.getRemoteUser();
-    
     logger.debug(name);
     Map<String, Object> result = new HashMap<String, Object>();
     result.put("message", "Good " + name);
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/ADomain.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/ABaseDomain.java
similarity index 97%
rename from samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/ADomain.java
rename to samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/ABaseDomain.java
index 9ec4049..deb959c 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/ADomain.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/ABaseDomain.java
@@ -11,7 +11,7 @@
 import org.hibernate.annotations.GenericGenerator;
 
 @MappedSuperclass
-public abstract class ADomain implements Serializable {
+public abstract class ABaseDomain implements Serializable {
 
   /**
    * 
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/User.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/User.java
index 86fc807..212598b 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/User.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/domain/User.java
@@ -9,7 +9,7 @@
 @Entity
 @Table(name = "TB_U_USER")
 @Data
-public class User extends ADomain {
+public class User extends ABaseDomain {
 
   /**
    * 
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/ABaseJpaRepositoryImpl.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/ABaseJpaRepositoryImpl.java
new file mode 100644
index 0000000..5dabe82
--- /dev/null
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/ABaseJpaRepositoryImpl.java
@@ -0,0 +1,84 @@
+package com.supwisdom.leaveschool.user.repository;
+
+import java.util.Calendar;
+import java.util.Map;
+import java.util.Optional;
+
+import javax.persistence.EntityManager;
+import javax.transaction.Transactional;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.jpa.repository.support.JpaEntityInformation;
+import org.springframework.data.jpa.repository.support.SimpleJpaRepository;
+import org.springframework.data.repository.NoRepositoryBean;
+
+import com.supwisdom.leaveschool.user.domain.ABaseDomain;
+
+@Transactional
+//@NoRepositoryBean
+public class ABaseJpaRepositoryImpl<T extends ABaseDomain> extends SimpleJpaRepository<T, String> implements BaseJpaRepository<T> {
+
+  @SuppressWarnings("unused")
+  private final EntityManager em;
+
+  public ABaseJpaRepositoryImpl(Class<T> domainClass, EntityManager em) {
+    super(domainClass, em);
+    this.em = em;
+  }
+
+  public ABaseJpaRepositoryImpl(JpaEntityInformation<T, String> information, EntityManager em) {
+    super(information, em);
+    this.em = em;
+  }
+  
+  public Page<T> selectPageList(int pageIndex, int pageSize, Map<String, Object> mapBean) {
+
+    PageRequest pageRequest = PageRequest.of(pageIndex, pageSize);
+
+    Page<T> page = this.findAll(pageRequest);
+
+    return page;
+  }
+
+  public T selectById(String id) {
+
+    try {
+      Optional<T> entity = this.findById(id);
+
+      return entity.get();
+    } catch (RuntimeException e) {
+      System.out.println("RuntimeException:" + e.getMessage());
+    } catch (Exception e) {
+      System.out.println("Exception:" + e.getMessage());
+    }
+
+    return null;
+  }
+
+  public T insert(T entity) {
+
+    if (entity.getCompanyId() == null || entity.getCompanyId().isEmpty()) {
+      entity.setCompanyId("1");
+    }
+
+    entity.setDeleted(false);
+    //entity.setAddAccount(AuthUtil.getRemoteUser()); // FIXME: setAddAccount
+    entity.setAddTime(Calendar.getInstance().getTime());
+
+    T e = this.save(entity);
+
+    return e;
+  }
+
+  public T update(T entity) {
+
+    //entity.setEditAccount(AuthUtil.getRemoteUser()); // FIXME: setEditAccount
+    entity.setEditTime(Calendar.getInstance().getTime());
+
+    T e = this.save(entity);
+
+    return e;
+  }
+
+}
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/BaseJpaRepository.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/BaseJpaRepository.java
new file mode 100644
index 0000000..df5c1f4
--- /dev/null
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/BaseJpaRepository.java
@@ -0,0 +1,22 @@
+package com.supwisdom.leaveschool.user.repository;
+
+import java.util.Map;
+
+import org.springframework.data.domain.Page;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.repository.NoRepositoryBean;
+
+import com.supwisdom.leaveschool.user.domain.ABaseDomain;
+
+@NoRepositoryBean
+public interface BaseJpaRepository<T extends ABaseDomain> extends JpaRepository<T, String> {
+  
+  public Page<T> selectPageList(int pageIndex, int pageSize, Map<String, Object> mapBean);
+  
+  public T selectById(String id);
+  
+  public T insert(T entity);
+  
+  public T update(T entity);
+
+}
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/UserRepository.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/UserRepository.java
index 5bcc1e3..2d67881 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/UserRepository.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/repository/UserRepository.java
@@ -8,14 +8,12 @@
 import org.springframework.data.domain.ExampleMatcher;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
-import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.stereotype.Repository;
 
 import com.supwisdom.leaveschool.user.domain.User;
-import com.supwisdom.leaveschool.user.util.AuthUtil;
 
 @Repository
-public interface UserRepository extends JpaRepository<User, String> {
+public interface UserRepository extends BaseJpaRepository<User> {
   
   public default Page<User> selectPageList(int pageIndex, int pageSize, Map<String, Object> mapBean) {
     User probe = new User();
@@ -60,7 +58,7 @@
     }
     
     entity.setDeleted(false);
-    entity.setAddAccount(AuthUtil.getRemoteUser());
+    //entity.setAddAccount(AuthUtil.getRemoteUser());
     entity.setAddTime(Calendar.getInstance().getTime());
     
     User e = this.save(entity);
@@ -70,7 +68,7 @@
   
   public default User update(User entity) {
     
-    entity.setEditAccount(AuthUtil.getRemoteUser());
+    //entity.setEditAccount(AuthUtil.getRemoteUser());
     entity.setEditTime(Calendar.getInstance().getTime());
     
     User e = this.save(entity);
@@ -78,4 +76,5 @@
     return e;
   }
 
+
 }
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test.java
index 2ded0aa..e42b225 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test.java
@@ -4,9 +4,9 @@
 
 import javax.persistence.Column;
 
-import com.supwisdom.leaveschool.user.domain.ADomain;
+import com.supwisdom.leaveschool.user.domain.ABaseDomain;
 
-public class Test extends ADomain {
+public class Test extends ABaseDomain {
 
   /**
    * 
diff --git a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test2.java b/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test2.java
index 426209f..3793233 100644
--- a/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test2.java
+++ b/samples/user/src/main/java/com/supwisdom/leaveschool/user/util/Test2.java
@@ -4,9 +4,9 @@
 
 import javax.persistence.Column;
 
-import com.supwisdom.leaveschool.user.domain.ADomain;
+import com.supwisdom.leaveschool.user.domain.ABaseDomain;
 
-public class Test2 extends ADomain {
+public class Test2 extends ABaseDomain {
 
   /**
    * 
diff --git a/samples/user/src/main/resources/application.yml b/samples/user/src/main/resources/application.yml
index fff91a4..9f6ca40 100755
--- a/samples/user/src/main/resources/application.yml
+++ b/samples/user/src/main/resources/application.yml
@@ -6,6 +6,7 @@
   level:
     root: INFO
     org.springframework.web: TRACE
+    org.springframework.data.jpa: TRACE
     com.supwisdom.infras.security: DEBUG
     com.supwisdom.leaveschool: DEBUG