From 9ebfb2cb49cc0bb5e13c7a57e77cfe4c36c098fa Mon Sep 17 00:00:00 2001 From: wangyu <727842003@qq.com> Date: Sat, 8 Jan 2022 09:44:48 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=8F=90=E5=87=BA=E5=85=AC?= =?UTF-8?q?=E5=85=B1=E5=AE=A1=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../validation/groups/CodeValid.java | 9 +++++ .../validation/groups/NameValid.java | 9 +++++ .../validation/spi/ConditionalGroup.java | 20 +++++++++++ .../framework/auditor/CommonBeanAuditor.java | 26 ++++++++++++++ .../auditor/ReactiveCommonBeanAuditor.java | 36 +++++++++++++++++++ .../flyfish/framework/domain/base/Domain.java | 22 +++--------- .../generation/CodeRuleStrategy.java | 11 ++++++ .../framework/generation/CodeRules.java | 21 +++++++++-- ...alidRequestBodyMethodArgumentResolver.java | 31 ++++++++++------ .../service/impl/BaseReactiveServiceImpl.java | 13 ++++--- .../service/impl/BaseServiceImpl.java | 4 +++ 11 files changed, 167 insertions(+), 35 deletions(-) create mode 100644 flyfish-common/src/main/java/com/flyfish/framework/validation/groups/CodeValid.java create mode 100644 flyfish-common/src/main/java/com/flyfish/framework/validation/groups/NameValid.java create mode 100644 flyfish-data/src/main/java/com/flyfish/framework/auditor/CommonBeanAuditor.java create mode 100644 flyfish-data/src/main/java/com/flyfish/framework/auditor/ReactiveCommonBeanAuditor.java diff --git a/flyfish-common/src/main/java/com/flyfish/framework/validation/groups/CodeValid.java b/flyfish-common/src/main/java/com/flyfish/framework/validation/groups/CodeValid.java new file mode 100644 index 0000000..d21d9c6 --- /dev/null +++ b/flyfish-common/src/main/java/com/flyfish/framework/validation/groups/CodeValid.java @@ -0,0 +1,9 @@ +package com.flyfish.framework.validation.groups; + +/** + * 公共校验,可被策略忽略 + * + * @author wangyu + */ +public interface CodeValid { +} diff --git a/flyfish-common/src/main/java/com/flyfish/framework/validation/groups/NameValid.java b/flyfish-common/src/main/java/com/flyfish/framework/validation/groups/NameValid.java new file mode 100644 index 0000000..8598b9a --- /dev/null +++ b/flyfish-common/src/main/java/com/flyfish/framework/validation/groups/NameValid.java @@ -0,0 +1,9 @@ +package com.flyfish.framework.validation.groups; + +/** + * 公共校验,可被策略忽略 + * + * @author wangyu + */ +public interface NameValid { +} diff --git a/flyfish-common/src/main/java/com/flyfish/framework/validation/spi/ConditionalGroup.java b/flyfish-common/src/main/java/com/flyfish/framework/validation/spi/ConditionalGroup.java index 9f339a4..f16a28e 100644 --- a/flyfish-common/src/main/java/com/flyfish/framework/validation/spi/ConditionalGroup.java +++ b/flyfish-common/src/main/java/com/flyfish/framework/validation/spi/ConditionalGroup.java @@ -9,6 +9,7 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * 指定动态分组 + * * @author wangyu */ @Target({TYPE}) @@ -16,5 +17,24 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; @Documented public @interface ConditionalGroup { + /** + * 自定义验证分组提供者 + * + * @return 结果 + */ Class>[] value() default {}; + + /** + * 是否不验证编码 + * + * @return 结果 + */ + boolean codeless() default false; + + /** + * 是否不验证名称 + * + * @return 结果 + */ + boolean nameless() default false; } diff --git a/flyfish-data/src/main/java/com/flyfish/framework/auditor/CommonBeanAuditor.java b/flyfish-data/src/main/java/com/flyfish/framework/auditor/CommonBeanAuditor.java new file mode 100644 index 0000000..8811bbf --- /dev/null +++ b/flyfish-data/src/main/java/com/flyfish/framework/auditor/CommonBeanAuditor.java @@ -0,0 +1,26 @@ +package com.flyfish.framework.auditor; + +import com.flyfish.framework.domain.base.Domain; +import com.flyfish.framework.generation.CodeRules; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +@Component +public class CommonBeanAuditor implements BeanAuditor { + + /** + * 对实体进行审查,并补全相关字段 + * + * @param data 原数据 + */ + @Override + public void audit(Domain data) { + // 编码审查,自动生成 + if (StringUtils.isBlank(data.getId()) && StringUtils.isBlank(data.getCode())) { + String ruledCode = CodeRules.get(data); + if (null != ruledCode) { + data.setCode(ruledCode); + } + } + } +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/auditor/ReactiveCommonBeanAuditor.java b/flyfish-data/src/main/java/com/flyfish/framework/auditor/ReactiveCommonBeanAuditor.java new file mode 100644 index 0000000..a09bc7f --- /dev/null +++ b/flyfish-data/src/main/java/com/flyfish/framework/auditor/ReactiveCommonBeanAuditor.java @@ -0,0 +1,36 @@ +package com.flyfish.framework.auditor; + +import com.flyfish.framework.domain.base.Domain; +import com.flyfish.framework.generation.CodeRules; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Mono; + +/** + * 异步公共审查 + * + * @author wangyu + */ +@Component +public class ReactiveCommonBeanAuditor implements ReactiveBeanAuditor { + + /** + * 对实体进行审查,并补全相关字段 + * + * @param data 原数据 + * @return 结果 + */ + @Override + public Mono audit(Domain data) { + // 编码审查,自动生成 + if (StringUtils.isBlank(data.getId()) && StringUtils.isBlank(data.getCode())) { + return CodeRules.retrieve(data) + .map(code -> { + data.setCode(code); + return data; + }) + .thenReturn(data); + } + return Mono.just(data); + } +} diff --git a/flyfish-data/src/main/java/com/flyfish/framework/domain/base/Domain.java b/flyfish-data/src/main/java/com/flyfish/framework/domain/base/Domain.java index a3516e5..8871938 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/domain/base/Domain.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/domain/base/Domain.java @@ -3,11 +3,10 @@ package com.flyfish.framework.domain.base; import com.fasterxml.jackson.annotation.JsonIgnore; import com.flyfish.framework.annotations.Generation; import com.flyfish.framework.annotations.Property; -import com.flyfish.framework.generation.CodeRules; -import lombok.AccessLevel; +import com.flyfish.framework.validation.groups.CodeValid; +import com.flyfish.framework.validation.groups.NameValid; import lombok.Getter; import lombok.Setter; -import org.apache.commons.lang3.StringUtils; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Transient; import org.springframework.data.mongodb.core.index.Indexed; @@ -34,9 +33,8 @@ public abstract class Domain implements Po, Named, Serializable { * 编号 */ @Property(title = "编码", inherited = true) - @NotBlank(message = "编码不可为空") + @NotBlank(message = "编码不可为空", groups = CodeValid.class) @Generation(Generation.Strategy.CODE) - @Getter(AccessLevel.NONE) protected String code; /** @@ -44,7 +42,7 @@ public abstract class Domain implements Po, Named, Serializable { */ @Indexed @Property(title = "名称", inherited = true) - @NotBlank(message = "名称不可为空") + @NotBlank(message = "名称不可为空", groups = NameValid.class) @Generation(Generation.Strategy.NAME) protected String name; @@ -56,18 +54,6 @@ public abstract class Domain implements Po, Named, Serializable { @Property(readonly = true) private IUser currentUser; - /** - * 自动生成code环节 - * - * @return 结果 - */ - public String getCode() { - if (StringUtils.isBlank(id) && StringUtils.isBlank(code)) { - code = CodeRules.getCode(this); - } - return code; - } - @Override public int hashCode() { if (id != null) { diff --git a/flyfish-data/src/main/java/com/flyfish/framework/generation/CodeRuleStrategy.java b/flyfish-data/src/main/java/com/flyfish/framework/generation/CodeRuleStrategy.java index 18cc7a7..67edd27 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/generation/CodeRuleStrategy.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/generation/CodeRuleStrategy.java @@ -1,6 +1,7 @@ package com.flyfish.framework.generation; import com.flyfish.framework.domain.base.Domain; +import reactor.core.publisher.Mono; /** * 代码规则策略 @@ -16,4 +17,14 @@ public interface CodeRuleStrategy { * @return 结果 */ String generate(Domain domain); + + /** + * 异步方式,支持异步请求 + * + * @param domain 实体 + * @return 结果 + */ + default Mono retrieve(Domain domain) { + return Mono.just(generate(domain)); + } } diff --git a/flyfish-data/src/main/java/com/flyfish/framework/generation/CodeRules.java b/flyfish-data/src/main/java/com/flyfish/framework/generation/CodeRules.java index d3c51be..386a7aa 100644 --- a/flyfish-data/src/main/java/com/flyfish/framework/generation/CodeRules.java +++ b/flyfish-data/src/main/java/com/flyfish/framework/generation/CodeRules.java @@ -5,7 +5,7 @@ import com.flyfish.framework.domain.base.Domain; import com.flyfish.framework.generation.strategy.TransactionCodeRuleStrategy; import com.flyfish.framework.generation.strategy.UUIDCodeRuleStrategy; import com.flyfish.framework.utils.ReflectionUtils; -import org.apache.commons.lang3.StringUtils; +import reactor.core.publisher.Mono; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -32,12 +32,27 @@ public interface CodeRules { * @param instance 实体 * @return 结果 */ - static String getCode(Domain instance) { + static String get(Domain instance) { CodeRule rule = instance.getClass().getAnnotation(CodeRule.class); - if (null != rule && StringUtils.isBlank(instance.getId())) { + if (null != rule) { CodeRuleStrategy strategy = strategies.computeIfAbsent(rule.value(), ReflectionUtils::instantiate); return strategy.generate(instance); } return null; } + + /** + * 异步获取code + * + * @param instance 实体 + * @return 结果 + */ + static Mono retrieve(Domain instance) { + CodeRule rule = instance.getClass().getAnnotation(CodeRule.class); + if (null != rule) { + CodeRuleStrategy strategy = strategies.computeIfAbsent(rule.value(), ReflectionUtils::instantiate); + return strategy.retrieve(instance); + } + return Mono.empty(); + } } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/configuration/resolver/ValidRequestBodyMethodArgumentResolver.java b/flyfish-web/src/main/java/com/flyfish/framework/configuration/resolver/ValidRequestBodyMethodArgumentResolver.java index 3f0092c..98b9327 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/configuration/resolver/ValidRequestBodyMethodArgumentResolver.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/configuration/resolver/ValidRequestBodyMethodArgumentResolver.java @@ -1,6 +1,8 @@ package com.flyfish.framework.configuration.resolver; import com.flyfish.framework.configuration.annotations.ValidRequestBody; +import com.flyfish.framework.validation.groups.CodeValid; +import com.flyfish.framework.validation.groups.NameValid; import com.flyfish.framework.validation.spi.ConditionalGroup; import com.flyfish.framework.validation.spi.ConditionalValidGroupProvider; import org.apache.commons.collections4.CollectionUtils; @@ -30,7 +32,6 @@ import org.springframework.web.server.UnsupportedMediaTypeStatusException; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import javax.validation.groups.Default; import java.util.*; import java.util.stream.Collectors; @@ -153,17 +154,27 @@ public class ValidRequestBodyMethodArgumentResolver extends AbstractMessageReade @NonNull private Object[] extractValidationHints(Object target) { ConditionalGroup group = AnnotationUtils.findAnnotation(target.getClass(), ConditionalGroup.class); - if (null != group && ArrayUtils.isNotEmpty(group.value())) { - List> groups = new ArrayList<>(); - for (Class> clazz : group.value()) { - try { - groups.addAll(Arrays.asList(clazz.newInstance().provide(CastUtils.cast(target)))); - } catch (InstantiationException | IllegalAccessException ignored) { + List> groups = new ArrayList<>(); + if (null != group) { + if (!group.codeless()) { + groups.add(CodeValid.class); + } + if (!group.nameless()) { + groups.add(NameValid.class); + } + if (ArrayUtils.isNotEmpty(group.value())) { + for (Class> clazz : group.value()) { + try { + groups.addAll(Arrays.asList(clazz.newInstance().provide(CastUtils.cast(target)))); + } catch (InstantiationException | IllegalAccessException ignored) { + } } } - if (CollectionUtils.isNotEmpty(groups)) { - return groups.toArray(); - } + } else { + groups = Arrays.asList(CodeValid.class, NameValid.class); + } + if (CollectionUtils.isNotEmpty(groups)) { + return groups.toArray(); } return new Object[]{}; } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseReactiveServiceImpl.java b/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseReactiveServiceImpl.java index 2201f24..8c323b0 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseReactiveServiceImpl.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseReactiveServiceImpl.java @@ -44,6 +44,8 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe @Autowired(required = false) protected ReactiveBeanPoster poster; @Autowired + private ReactiveBeanAuditor commonAuditor; + @Autowired private ReactiveBeanAuditor operationAuditor; @Autowired private ReactiveBeanAuditor authorizeAuditor; @@ -373,19 +375,22 @@ public class BaseReactiveServiceImpl implements BaseReactiveSe * * @param entity 实体 */ + @SuppressWarnings("unchecked") protected Mono audit(T entity) { Mono mono = Mono.just(entity); // 首先自定义审查,可能返回自定义对象 if (auditor != null) { mono = mono.flatMap(auditor::audit); } - // 操作信息审查 + // 然后公共审查 + mono = (Mono) mono.flatMap(commonAuditor::audit); + // 接着操作信息审查 if (entity instanceof AuditDomain) { - mono = CastUtils.cast(mono.cast(AuditDomain.class).flatMap(operationAuditor::audit)); + mono = (Mono) mono.cast(AuditDomain.class).flatMap(operationAuditor::audit); } - // 权限审查 + // 最后权限审查 if (entity instanceof AuthorizedDomain) { - mono = CastUtils.cast(mono.cast(AuthorizedDomain.class).flatMap(authorizeAuditor::audit)); + mono = (Mono) mono.cast(AuthorizedDomain.class).flatMap(authorizeAuditor::audit); } return mono; } diff --git a/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseServiceImpl.java b/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseServiceImpl.java index 337ff04..9f9d105 100644 --- a/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseServiceImpl.java +++ b/flyfish-web/src/main/java/com/flyfish/framework/service/impl/BaseServiceImpl.java @@ -35,6 +35,8 @@ public class BaseServiceImpl implements BaseService { @Autowired(required = false) protected BeanPoster poster; @Autowired + private BeanAuditor commonAuditor; + @Autowired private BeanAuditor operationAuditor; @Autowired private BeanAuditor authorizeAuditor; @@ -348,6 +350,8 @@ public class BaseServiceImpl implements BaseService { if (auditor != null) { auditor.audit(entity); } + // 公共审查 + commonAuditor.audit(entity); // 用户审查 if (entity instanceof AuditDomain) { operationAuditor.audit((AuditDomain) entity);