ソースを参照

优化逻辑主键

zhouhao 6 年 前
コミット
a10a819634

+ 9 - 0
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/AbstractService.java

@@ -6,10 +6,12 @@ import org.hswebframework.web.commons.entity.Entity;
 import org.hswebframework.web.commons.entity.factory.EntityFactory;
 import org.hswebframework.web.validate.SimpleValidateResults;
 import org.hswebframework.web.validate.ValidationException;
+import org.hswebframework.web.validator.LogicPrimaryKeyValidator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import javax.annotation.PostConstruct;
 import javax.validation.ConstraintViolation;
 import javax.validation.Validator;
 import java.util.Set;
@@ -29,6 +31,8 @@ public abstract class AbstractService<E extends Entity, PK> implements CreateEnt
 
     protected EntityFactory entityFactory;
 
+    protected LogicPrimaryKeyValidator logicPrimaryKeyValidator;
+
     @Autowired(required = false)
     public void setValidator(Validator validator) {
         this.validator = validator;
@@ -39,6 +43,11 @@ public abstract class AbstractService<E extends Entity, PK> implements CreateEnt
         this.entityFactory = entityFactory;
     }
 
+    @Autowired(required = false)
+    public void setLogicPrimaryKeyValidator(LogicPrimaryKeyValidator logicPrimaryKeyValidator) {
+        this.logicPrimaryKeyValidator = logicPrimaryKeyValidator;
+    }
+
     protected Class<E> entityType;
 
     protected Class<PK> primaryKeyType;

+ 23 - 5
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/DefaultLogicPrimaryKeyValidator.java

@@ -28,12 +28,21 @@ public class DefaultLogicPrimaryKeyValidator implements LogicPrimaryKeyValidator
     private static final Map<Class, Map<Class, Validator>> validatorCache = new HashMap<>();
 
 
-    private static final Validator EMPTY_VALIDATOR = bean -> {
+    private static final DefaultLogicPrimaryKeyValidator instrance = new DefaultLogicPrimaryKeyValidator();
+
+    protected DefaultLogicPrimaryKeyValidator() {
+    }
+
+    public static DefaultLogicPrimaryKeyValidator getInstrance() {
+        return instrance;
+    }
+
+    private static final Validator ALWAYS_PASSED_VALIDATOR = bean -> {
         return Result.passed();
     };
 
-    public <T> void registerQuerySuppiler(Class<T> type, Function<T, Query<T, QueryParamEntity>> querySupplier) {
-        validatorCache.computeIfAbsent(type, this::createValidator)
+    public static <T> void registerQuerySuppiler(Class<T> type, Function<T, Query<T, QueryParamEntity>> querySupplier) {
+        validatorCache.computeIfAbsent(type, instrance::createValidator)
                 .values()
                 .stream()
                 .filter(DefaultValidator.class::isInstance)
@@ -50,7 +59,7 @@ public class DefaultLogicPrimaryKeyValidator implements LogicPrimaryKeyValidator
             result = Arrays.stream(groups)
                     .map(group ->
                             validatorCache.computeIfAbsent(target, this::createValidator)
-                                    .getOrDefault(group, EMPTY_VALIDATOR)
+                                    .getOrDefault(group, ALWAYS_PASSED_VALIDATOR)
                                     .doValidate(bean))
                     .filter(Result::isError)
                     .findFirst()
@@ -58,7 +67,7 @@ public class DefaultLogicPrimaryKeyValidator implements LogicPrimaryKeyValidator
 
         } else {
             result = validatorCache.computeIfAbsent(target, this::createValidator)
-                    .getOrDefault(Void.class, EMPTY_VALIDATOR)
+                    .getOrDefault(Void.class, ALWAYS_PASSED_VALIDATOR)
                     .doValidate(bean);
         }
         return result;
@@ -134,6 +143,7 @@ public class DefaultLogicPrimaryKeyValidator implements LogicPrimaryKeyValidator
                                 Collectors.mapping(Function.identity(), Collectors.toSet())
                                 , list -> DefaultValidator.builder()
                                         .infos(list)
+                                        .targetType(target)
                                         .build())
                         )
                 );
@@ -148,10 +158,18 @@ public class DefaultLogicPrimaryKeyValidator implements LogicPrimaryKeyValidator
     static class DefaultValidator<T> implements Validator<T> {
         private Set<LogicPrimaryKeyField> infos = new HashSet<>();
 
+        private Class<T> targetType;
+
         private volatile Function<T, Query<T, QueryParamEntity>> querySupplier;
 
         public Result doValidate(T bean) {
             if (querySupplier == null) {
+                log.warn("未设置查询函数," +
+                                "你可以在服务初始化的时候通过调用" +
+                                "DefaultLogicPrimaryKeyValidator" +
+                                ".registerQuerySuppiler({},bean -> this.createQuery().not(\"id\", bean.getId()))" +
+                                "进行设置"
+                        , targetType);
                 return Result.passed();
             }
 

+ 1 - 5
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/main/java/org/hswebframework/web/service/GenericEntityService.java

@@ -57,14 +57,10 @@ public abstract class GenericEntityService<E extends GenericEntity<PK>, PK>
      */
     protected abstract IDGenerator<PK> getIDGenerator();
 
-    @Autowired(required = false)
-    public LogicPrimaryKeyValidator logicPrimaryKeyValidator;
-
     @PostConstruct
     public void init() {
         if (null != logicPrimaryKeyValidator && logicPrimaryKeyValidator instanceof DefaultLogicPrimaryKeyValidator) {
-            ((DefaultLogicPrimaryKeyValidator) logicPrimaryKeyValidator)
-                    .registerQuerySuppiler(getEntityInstanceType(), bean -> this.createQuery().not("id", bean.getId()));
+            DefaultLogicPrimaryKeyValidator.registerQuerySuppiler(getEntityInstanceType(), bean -> this.createQuery().not("id", bean.getId()));
         }
     }
 

+ 4 - 4
hsweb-commons/hsweb-commons-service/hsweb-commons-service-simple/src/test/java/org/hswebframework/web/service/DefaultLogicPrimaryKeyValidatorTest.java

@@ -19,7 +19,7 @@ public class DefaultLogicPrimaryKeyValidatorTest {
 
     @Test
     public void testSimple() {
-        validator.registerQuerySuppiler(TestBean.class, bean ->
+        DefaultLogicPrimaryKeyValidator.registerQuerySuppiler(TestBean.class, bean ->
                 Query.<TestBean, QueryParamEntity>empty(QueryParamEntity.empty())
                         .setSingleExecutor(param -> {
                             Assert.assertNotNull(param.getTerms());
@@ -34,7 +34,7 @@ public class DefaultLogicPrimaryKeyValidatorTest {
 
     @Test
     public void testClassAnn() {
-        validator.registerQuerySuppiler(ClassAnnTestBean.class, bean ->
+        DefaultLogicPrimaryKeyValidator.registerQuerySuppiler(ClassAnnTestBean.class, bean ->
                 Query.<ClassAnnTestBean, QueryParamEntity>empty(QueryParamEntity.empty())
                         .setSingleExecutor(param -> {
                             Assert.assertNotNull(param.getTerms());
@@ -49,7 +49,7 @@ public class DefaultLogicPrimaryKeyValidatorTest {
 
     @Test
     public void testGroupAnn() {
-        validator.registerQuerySuppiler(GroupAnnTestBean.class, bean ->
+        DefaultLogicPrimaryKeyValidator.registerQuerySuppiler(GroupAnnTestBean.class, bean ->
                 Query.<GroupAnnTestBean, QueryParamEntity>empty(QueryParamEntity.empty())
                         .setSingleExecutor(param -> {
                             Assert.assertNotNull(param.getTerms());
@@ -68,7 +68,7 @@ public class DefaultLogicPrimaryKeyValidatorTest {
     public void testNestProperty() {
         NestTestBean nestTestBean=new NestTestBean(new TestBean("test","1"),"test");
 
-        validator.registerQuerySuppiler(NestTestBean.class, bean ->
+        DefaultLogicPrimaryKeyValidator.registerQuerySuppiler(NestTestBean.class, bean ->
                 Query.<NestTestBean, QueryParamEntity>empty(QueryParamEntity.empty())
                         .setSingleExecutor(param -> {
                             Assert.assertNotNull(param.getTerms());

+ 1 - 1
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/HswebAutoConfiguration.java

@@ -179,7 +179,7 @@ public class HswebAutoConfiguration {
     @Bean
     @ConditionalOnMissingBean(LogicPrimaryKeyValidator.class)
     public LogicPrimaryKeyValidator logicPrimaryKeyValidator() {
-        return new DefaultLogicPrimaryKeyValidator();
+        return DefaultLogicPrimaryKeyValidator.getInstrance();
     }
 
     @Bean