在 JAVA 和 Spring 中设计自定义工作流程
Designing custom workflow in JAVA and Spring
我正在开发 spring 2.0.1.RELEASE 应用程序。
Brief of Application:
1. I have separate Transformer beans that transforms my DTO to Domain
and vice versa.
2. I have separate Validator beans that validate my domain object being passed.
3. I have Service classes that takes care of the applying rules and calling persistence layer.
Now, i want to build a Workflow in my application:
where i will just call the start of the workflow and below mentioned steps will be executed in order and exception handling will be done as per the step:
1.First-Transformtion - transformToDomain() method will be called for that object type.
2.Second-Validator - class valid() method will be called for that object.
3.Third-Service - class save() method will be called for that object.
4.Fourth- Transformation - transformToDTO() method will be called for that object type.
此后我的工作流程结束,我将 return DTO 对象作为我的 REST 的响应 API。
异常处理部分是一个,我也想处理,比如如果该步骤存在特定的异常处理程序然后调用它,否则调用全局异常处理程序。
我设计了一些相同的原型,但正在寻找一些专家建议以及如何通过 java 中更好的设计来实现这一点。
考虑到上述用例的示例说明非常有用。
我不太确定您所描述的是否是真正意义上的工作流系统,也许 责任链 更符合您的意思?
按照您描述的执行顺序,这是我将如何实现链的简化示例:
Transformer.java
public interface Transformer<IN, OUT> {
OUT transformToDomain(IN dto);
IN transformToDTO(OUT domainObject);
}
Validator.java
public interface Validator<T> {
boolean isValid(T object);
}
Service.java
public interface Service {
void save(Object object);
}
以及绑定一切的实现:
ProcessChain.java
public class ProcessChain {
private Transformer transformer;
private Service service;
private Validator validator;
Object process(Object dto) throws MyValidationException {
Object domainObject = transformer.transformToDomain(dto);
boolean isValid = validator.isValid(domainObject);
if(!isValid){
throw new MyValidationException("Validation message here");
}
service.save(domainObject);
return transformer.transformToDTO(domainObject);
}
}
我没有在此处指定任何 Spring 相关内容,因为您的问题似乎是设计问题而不是技术问题。
希望对您有所帮助
简要我以一种不太忙的方式实现的内容:
这就是我创建处理程序流的方式:
Stream.<Supplier<RequestHandler>>of(
TransformToDomainRequestHandler::new,
ValidateRequestHandler::new,
PersistenceHandler::new,
TransformToDTORequestHandler::new)
.sequential()
.map(c -> c.get()) /* Create the handler instance */
.reduce((processed, unProcessed) -> { /* chains all handlers together */
RequestHandler previous = processed;
RequestHandler target = previous.getNextRequestHandler();
while (target != null && previous != null) {
previous = target;
target = target.getNextRequestHandler();
}
previous.setNextRequestHandler(unProcessed);
return processed;
}).get();
这是所有其他处理程序扩展的我的请求处理程序
我正在开发 spring 2.0.1.RELEASE 应用程序。
Brief of Application:
1. I have separate Transformer beans that transforms my DTO to Domain
and vice versa.
2. I have separate Validator beans that validate my domain object being passed.
3. I have Service classes that takes care of the applying rules and calling persistence layer.
Now, i want to build a Workflow in my application: where i will just call the start of the workflow and below mentioned steps will be executed in order and exception handling will be done as per the step:
1.First-Transformtion - transformToDomain() method will be called for that object type.
2.Second-Validator - class valid() method will be called for that object.
3.Third-Service - class save() method will be called for that object.
4.Fourth- Transformation - transformToDTO() method will be called for that object type.
此后我的工作流程结束,我将 return DTO 对象作为我的 REST 的响应 API。
异常处理部分是一个,我也想处理,比如如果该步骤存在特定的异常处理程序然后调用它,否则调用全局异常处理程序。
我设计了一些相同的原型,但正在寻找一些专家建议以及如何通过 java 中更好的设计来实现这一点。
考虑到上述用例的示例说明非常有用。
我不太确定您所描述的是否是真正意义上的工作流系统,也许 责任链 更符合您的意思?
按照您描述的执行顺序,这是我将如何实现链的简化示例:
Transformer.java
public interface Transformer<IN, OUT> {
OUT transformToDomain(IN dto);
IN transformToDTO(OUT domainObject);
}
Validator.java
public interface Validator<T> {
boolean isValid(T object);
}
Service.java
public interface Service {
void save(Object object);
}
以及绑定一切的实现: ProcessChain.java
public class ProcessChain {
private Transformer transformer;
private Service service;
private Validator validator;
Object process(Object dto) throws MyValidationException {
Object domainObject = transformer.transformToDomain(dto);
boolean isValid = validator.isValid(domainObject);
if(!isValid){
throw new MyValidationException("Validation message here");
}
service.save(domainObject);
return transformer.transformToDTO(domainObject);
}
}
我没有在此处指定任何 Spring 相关内容,因为您的问题似乎是设计问题而不是技术问题。
希望对您有所帮助
简要我以一种不太忙的方式实现的内容:
这就是我创建处理程序流的方式:
Stream.<Supplier<RequestHandler>>of(
TransformToDomainRequestHandler::new,
ValidateRequestHandler::new,
PersistenceHandler::new,
TransformToDTORequestHandler::new)
.sequential()
.map(c -> c.get()) /* Create the handler instance */
.reduce((processed, unProcessed) -> { /* chains all handlers together */
RequestHandler previous = processed;
RequestHandler target = previous.getNextRequestHandler();
while (target != null && previous != null) {
previous = target;
target = target.getNextRequestHandler();
}
previous.setNextRequestHandler(unProcessed);
return processed;
}).get();
这是所有其他处理程序扩展的我的请求处理程序