Весна: Как украсить некоторые входящие запросы с дополнительной логикой - PullRequest
0 голосов
/ 03 октября 2019

Я не знаю, как спросить об этом, не получив 10 голосов, и все ясно. У меня есть класс контроллера отдыха со многими конечными точками, выполняющими определенные операции над книгами в зависимости от действия.

Мой вопрос - это вопрос разработки, как мне лучше всего получить бизнес-логику для всех действий из из абстрактного класса контроллера (метод handleRequest)? Одним из вариантов, который я рассмотрел, является шаблон GOF Template, который может здесь хорошо вписаться. Проблема в том, что я не хочу создавать разные и пустые классы реализации для каждого типа действия. Возможно,% 80 типов входящих действий имеют общий поток. Я хочу создать исключение только для определенных типов действий и добавить к ним дополнительную логику. Другой вариант - шаблон перехватывающего фильтра, который все еще не вписывается в мою ситуацию.

mainController extends AbstractController{
   ....

  @PostMapping(value = "/getBooks/")
   public getBooks( @PathVariable ActionType action){
       handleGenericBookRequests(action)
  }

  ....

}

abstract class AbstractController{

 handleGenericBookRequests(action){
  //do mostly generic stuff
  //do generic stuff
 if (action1){
  //do some action1 specific stuff  using action 1 related services
 }
 if(action2){
  //do some action2 specific stuff  using action 2 related services
 }

 //continue
 ..
 }
}

Ответы [ 3 ]

1 голос
/ 03 октября 2019

Вы можете создать отдельный интерфейс ActionTypeFilter и реализовать классы действий. Затем вы можете использовать @Qualifier, чтобы квалифицировать его. Например, код:

@FunctionalInterface
interface ActionTypeFilter {
    void act();
}

@Component("action1")
class Action1 implements ActionTypeFilter {...}

@Component("action2")
class Action2 implements ActionTypeFilter {...}

А затем написать handleGenericBookRequests(action) в act:

@Autowired
ApplicationContext ctx;

void handleGenericBookRequests(ActionType action) {
    ActionTypeFilter atf = BeanFactoryAnnotationUtils
                              .qualifiedBeanOfType(
                                  ctx.getBeanFactory(), 
                                  ActionTypeFilter.class,
                                  action.getActionQualifier());
    atf::act; // invoke the act()
}
0 голосов
/ 08 октября 2019

Вы можете использовать стратегию для инкапсуляции работы. Реализуйте его один раз для обычных вещей и один раз для каждой особой ситуации.

Начните с отделения обработки вашего запроса от вашей бизнес-логики. Вот некоторый код:

@RestController
public class KapowController
{
    private final KapowService kapowService;

    public KapowController(final KapowService kapowServiceValue)
    {
        kapowService = kapowServiceValue;
    }

    @PostMapping(value = "/getBooks/{bookId}/{bookAction}"
    public ResponseEntity<BlamType> performBookAction(
        @PathVariable("bookId") final String bookId,
        @PathVariable("bookAction") final String bookAction)
    {
        final BlamType result;

        // in this case, validate bookid and bookAction in the service.
        result = kapowService.performBookAction(bookId, bookAction);

        return ResultEntity.status(HttpStatus.OK).body(result);
    }
}

@Service
public class KapowService
{
    public BlamType performBookAction(
        final String bookId,
        final String bookAction)
    {
        // do stuff.
    }
}

Далее, вы можете использовать стратегию для выполнения обычных и специальных задач. Вот некоторый код:

public interface BookActionStrategy
{
    BlamType doStuff(BlamType blamType, String bookId, BookAction bookAction);
}

@Component
public class BookActionNormal implements BookActionStrategy
{
    public BlamType doStuff(
        final BlamType blamType,
        final String bookId,
        final BookAction bookAction)
    {
        // do normal stuff.
        // maybe conditionally based on the BookAction.

        // do something meaningful with blamType.
        return blamType;
    }
}

@Component
public class BookActionSpecial implements BookActionStrategy
{
    public BlamType doStuff(
        final BlamType blamType,
        final String bookId,
        final BookAction bookAction)
    {
        // do special stuff based on the BookAction.

        // do something meaningful with blamType.
        return blamType;
    }
}

Внедрение List стратегии в сервис

final List<BookActionStrategy> bookActionStrategyList;

KapowService(final List<BookActionStrategy> bookActionStrategyListValue)

Наконец, вызовите каждую стратегию в методе KapowService.performBookAction.

0 голосов
/ 03 октября 2019

Ваш вопрос актуален, и вы можете пройти через перечисления,

Вы можете определить поведение действия, используя функциональные интерфейсы

 enum Action{
        Action_1(param -> "action for 1"), Action_2(param -> "action for 2"), Action_3(param -> "action for 3");
        private final DoSomething doSomething;

        Action(DoSomething action) {
            this.doSomething = action;
        }

        public DoSomething getDoSomething() {
            return doSomething;
        }
    }
    private interface DoSomething{
        public Object doIt(Object param);
    }
    handleGenericBookRequests(action){
        Action.valueOf(action).getDoSomething().doIt(your param)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...