Разработка пользовательских рабочих процессов в JAVA и Spring - PullRequest
0 голосов
/ 13 мая 2018

Я работаю над приложением 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.


Объяснение с примером с учетом вышеупомянутого варианта использования весьма заметно.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Кратко того, что я реализовал способом с небольшим количеством шума:

This is my design classes

Так я создал потокобработчики:

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

This is my Workflow State container

Это мой обработчик запросов, который расширяет все остальные обработчики


enter image description here

0 голосов
/ 13 мая 2018

Я не уверен, что то, что вы описываете, является системой рабочего процесса в ее истинном смысле, возможно, Цепочка ответственности больше того, о чем вы говорите?

После того, что вы описали как последовательность выполнения, вот упрощенный пример того, как я бы реализовал цепочку:

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 вещей, потому что ваш вопрос, кажется, скорее вопрос дизайна, чем вопросов технологии.

Надеюсь, это поможет

...