Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,16 @@
import org.landy.business.domain.file.RequestFile;
import org.landy.exception.BusinessValidationException;

import java.io.Serializable;

/**
* 业务校验统一接口,增加了接口的默认方法实现,这样可以更加方便且自由选择实现接口的哪些方法。
* @author landyl
* @create 10:32 AM 05/09/2018
* @version 2.0
* @since 1.0
*/
public interface Validator<R extends RequestDetail,F extends RequestFile> {
public interface Validator<R extends RequestDetail,F extends RequestFile> extends Serializable {

/**
* 需要引入责任链的时候,则采用此方法
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -19,7 +20,7 @@
* @create 10:41 AM 05/09/2018
*/
@Component
public class FileDetailValidatorChain implements ValidatorChain {
public class FileDetailValidatorChain implements ValidatorChain, Serializable {

Map<WorkflowEnum,List<Validator>> validatorMap = new HashMap<>();
Map<WorkflowEnum,Integer> validatorIndexMap = new HashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -30,7 +31,9 @@ public abstract class AbstractValidatorHandler implements ApplicationListener<Co
private static Map<WorkflowEnum,String> validatorHandlerMap = new HashMap<>();

@Autowired
protected FileDetailValidatorChain fileDetailValidatorChain;
private FileDetailValidatorChain fileDetailValidatorChain;



public AbstractValidatorHandler() {
validatorHandlerMap.put(getWorkflowId(),accessBeanName());
Expand All @@ -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());
Expand All @@ -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<? extends Validator> validator) {
Expand Down Expand Up @@ -91,15 +96,13 @@ protected void addValidator(String beanName,Class<? extends Validator> validator

private void addValidators() {
List<Class<? extends Validator>> validators = getValidators();

validators.forEach((validator) -> {
String simpleName = validator.getSimpleName();
String beanName = simpleName.substring(0, 1).toLowerCase() + simpleName.substring(1);

LOGGER.info("Added validator:{},spring bean name is:{}",simpleName,beanName);

Validator validatorInstance = ApplicationUtil.getApplicationContext().getBean(beanName,validator);

fileDetailValidatorChain.addValidator(validatorInstance,getWorkflowId());

});
Expand Down
40 changes: 40 additions & 0 deletions design-patterns-core/src/main/java/org/landy/utils/BeanUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -45,4 +50,39 @@ public static Class<?> getPropertyType(Object bean, String name) {
return null;
}

/**
* 序列化后拷贝流的方式克隆<br>
* 对象必须实现Serializable接口
*
* @param <T> 对象类型
* @param obj 被克隆对象
* @return 克隆后的对象
*/
@SuppressWarnings("unchecked")
public static <T> 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) {
// 静默关闭
}
}
}
}

}
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
<version>2.7</version>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
Expand Down