1

我正在开发一个 spring 2.0.1.RELEASE 应用程序。

申请简介:

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.

现在,我想在我的应用程序中构建一个工作流:我将在其中调用工作流的开始,下面提到的步骤将按顺序执行,异常处理将按步骤完成:

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.

在此之后我的工作流程结束,我将返回 DTO 对象作为我的 REST API 的响应。

异常处理部分是我也想处理的部分,例如如果该步骤存在特定的异常处理程序然后调用它,否则调用全局异常处理程序。

我设计了一些相同的原型,但正在寻找一些专家建议以及如何通过更好的java设计来实现这一点。


考虑到上述用例的示例解释是非常可观的。

4

2 回答 2

1

我不太确定您所描述的是否是真正意义上的工作流系统,也许责任链更像是您在谈论的内容?

按照您所描述的执行顺序,这是我将如何实现链的简化示例:

变压器.java

public interface Transformer<IN, OUT> {

  OUT transformToDomain(IN dto);

  IN transformToDTO(OUT domainObject);
}

验证器.java

public interface Validator<T> {

  boolean isValid(T object);
}

服务.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 相关的内容,因为您的问题似乎是设计问题而不是技术问题。

希望这可以帮助

于 2018-05-13T16:31:45.697 回答
0

我以一种不那么忙碌的方式实施的简要说明:

这是我的设计课

这就是我创建处理程序流的方式:

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();

这是我的工作流状态容器

这是我的所有其他处理程序扩展的请求处理程序


在此处输入图像描述

于 2018-05-17T15:06:04.263 回答