diff --git a/design-patterns-business/src/main/java/org/landy/business/validation/Validator.java b/design-patterns-business/src/main/java/org/landy/business/validation/Validator.java index de75cec..03bc484 100644 --- a/design-patterns-business/src/main/java/org/landy/business/validation/Validator.java +++ b/design-patterns-business/src/main/java/org/landy/business/validation/Validator.java @@ -4,6 +4,8 @@ import org.landy.business.domain.file.RequestFile; import org.landy.exception.BusinessValidationException; +import java.io.Serializable; + /** * 业务校验统一接口,增加了接口的默认方法实现,这样可以更加方便且自由选择实现接口的哪些方法。 * @author landyl @@ -11,7 +13,7 @@ * @version 2.0 * @since 1.0 */ -public interface Validator { +public interface Validator extends Serializable { /** * 需要引入责任链的时候,则采用此方法 diff --git a/design-patterns-business/src/main/java/org/landy/business/validation/detail/FileDetailValidatorChain.java b/design-patterns-business/src/main/java/org/landy/business/validation/detail/FileDetailValidatorChain.java index 0ad408f..f8fdde3 100644 --- a/design-patterns-business/src/main/java/org/landy/business/validation/detail/FileDetailValidatorChain.java +++ b/design-patterns-business/src/main/java/org/landy/business/validation/detail/FileDetailValidatorChain.java @@ -9,6 +9,7 @@ import org.landy.exception.BusinessValidationException; import org.springframework.stereotype.Component; +import java.io.Serializable; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -19,7 +20,7 @@ * @create 10:41 AM 05/09/2018 */ @Component -public class FileDetailValidatorChain implements ValidatorChain { +public class FileDetailValidatorChain implements ValidatorChain, Serializable { Map> validatorMap = new HashMap<>(); Map validatorIndexMap = new HashMap<>(); diff --git a/design-patterns-business/src/main/java/org/landy/business/validation/handler/AbstractValidatorHandler.java b/design-patterns-business/src/main/java/org/landy/business/validation/handler/AbstractValidatorHandler.java index a5a6ff5..ad42a9f 100644 --- a/design-patterns-business/src/main/java/org/landy/business/validation/handler/AbstractValidatorHandler.java +++ b/design-patterns-business/src/main/java/org/landy/business/validation/handler/AbstractValidatorHandler.java @@ -8,6 +8,7 @@ import org.landy.business.validation.Validator; import org.landy.business.validation.detail.FileDetailValidatorChain; import org.landy.exception.BusinessValidationException; +import org.landy.utils.BeanUtil; import org.landy.utils.PackageUtil; import org.landy.web.utils.ApplicationUtil; import org.slf4j.Logger; @@ -30,7 +31,9 @@ public abstract class AbstractValidatorHandler implements ApplicationListener validatorHandlerMap = new HashMap<>(); @Autowired - protected FileDetailValidatorChain fileDetailValidatorChain; + private FileDetailValidatorChain fileDetailValidatorChain; + + public AbstractValidatorHandler() { validatorHandlerMap.put(getWorkflowId(),accessBeanName()); @@ -45,6 +48,8 @@ public void onApplicationEvent(ContextRefreshedEvent event) { } public String validate(RequestDetail requestDetail, RequestFile requestFile) { + //克隆独立的校验器链 + FileDetailValidatorChain fileDetailValidatorChain = BeanUtil.cloneByStream(this.fileDetailValidatorChain); //must set the current workflowId fileDetailValidatorChain.setWorkflowId(getWorkflowId()); fileDetailValidatorChain.doClearValidatorIndex(getWorkflowId()); @@ -62,7 +67,7 @@ public static final AbstractValidatorHandler accessValidatorHandler(WorkflowEnum LOGGER.error("can not find {}'s component",beanName); throw new BusinessValidationException("can not find "+beanName + "'s component,current UPDATE_WORKFLOW_ID is :" + updateWorkflowId); } - return ApplicationUtil.getApplicationContext().getBean(beanName,AbstractValidatorHandler.class); + return ApplicationUtil.getApplicationContext().getBean(beanName, AbstractValidatorHandler.class); } protected void addValidator(String beanName,Class validator) { @@ -91,7 +96,6 @@ protected void addValidator(String beanName,Class validator private void addValidators() { List> validators = getValidators(); - validators.forEach((validator) -> { String simpleName = validator.getSimpleName(); String beanName = simpleName.substring(0, 1).toLowerCase() + simpleName.substring(1); @@ -99,7 +103,6 @@ private void addValidators() { LOGGER.info("Added validator:{},spring bean name is:{}",simpleName,beanName); Validator validatorInstance = ApplicationUtil.getApplicationContext().getBean(beanName,validator); - fileDetailValidatorChain.addValidator(validatorInstance,getWorkflowId()); }); diff --git a/design-patterns-core/src/main/java/org/landy/utils/BeanUtil.java b/design-patterns-core/src/main/java/org/landy/utils/BeanUtil.java index d58351a..4b9b329 100644 --- a/design-patterns-core/src/main/java/org/landy/utils/BeanUtil.java +++ b/design-patterns-core/src/main/java/org/landy/utils/BeanUtil.java @@ -2,7 +2,12 @@ import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.PropertyUtils; +import org.springframework.util.FastByteArrayOutputStream; +import java.io.ByteArrayInputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; import java.lang.reflect.InvocationTargetException; public class BeanUtil { @@ -45,4 +50,39 @@ public static Class getPropertyType(Object bean, String name) { return null; } + /** + * 序列化后拷贝流的方式克隆
+ * 对象必须实现Serializable接口 + * + * @param 对象类型 + * @param obj 被克隆对象 + * @return 克隆后的对象 + */ + @SuppressWarnings("unchecked") + public static T cloneByStream(T obj) { + if (!(obj instanceof Serializable)) { + return null; + } + final FastByteArrayOutputStream byteOut = new FastByteArrayOutputStream(); + ObjectOutputStream out = null; + //noinspection TryFinallyCanBeTryWithResources + try { + out = new ObjectOutputStream(byteOut); + out.writeObject(obj); + out.flush(); + final ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(byteOut.toByteArray())); + return (T) in.readObject(); + } catch (Exception e) { + throw new RuntimeException(e); + } finally { + if (null != out) { + try { + out.close(); + } catch (Exception e) { + // 静默关闭 + } + } + } + } + } diff --git a/pom.xml b/pom.xml index f15b2a9..a04e793 100644 --- a/pom.xml +++ b/pom.xml @@ -86,7 +86,7 @@ commons-io commons-io - 2.4 + 2.7 commons-lang