Выберите Spring bean в соответствии с параметром enum

Как упоминалось в @AliK, это можно сделать легко, посмотрев на значение кнопок отправки.

Когда вы отправляете форму, неустановленные переменные будут оценивать значение false. Если вы установили обе кнопки отправки в одну и ту же форму, вы можете просто проверить, какая кнопка была установлена.

HTML:

PHP

if($_POST["save"]) {
  //User hit the save button, handle accordingly
}
//You can do an else, but I prefer a separate statement
if($_POST["approve"]) {
  //User hit the Submit for Approval button, handle accordingly
}

РЕДАКТИРОВАТЬ Если вы не захотите изменить свою настройку PHP, попробуйте следующее: http://pastebin.com/j0GUF7MV Это метод JavaScript, на который ссылался @AliK.

Связано:

2
задан Andrey Tararaksin 5 March 2019 в 16:44
поделиться

2 ответа

Это немного зависит от специфики вашего дела. Во многих случаях этапы на самом деле не жестко запрограммированы, как в enum, а настраиваются для различных систем. Кроме того, чем больше потенциальных этапов у вас есть, тем больше стоит иметь более подробные настройки, но избегать повторения.

В общем, я бы порекомендовал паттерн решателя Spring здесь. Код выглядит примерно так, где KeyType обычно является перечислением или строкой. Общая идея заключается в том, что каждая реализация сообщает вам, с какими вещами (этапами, типами, параметрами и т. Д.) Она может справиться, и затем вы ищите соответствие. (Вариант, в котором нет прямого поиска по отображению, - это иметь boolean canHandle(something) и повторяться до тех пор, пока вы его не найдете.)

interface StageProcessor {
    OutputType process(Stage stage);
    KeyType stageKey();
}

@Service
class StageProcessors {
    Map<KeyType, StageProcessor> stageProcessors;

    StageProcessors(Collection<StageProcessor> processors) {
        stageProcessors = processors.stream().collect(groupingBy(StageProcessor::stageKey));
        assert stageProcessors.size() == expectedNumberOfProcessors;
    }

    StageProcessor getProcessor(KeyType stage) {
        // although usually your service would take care of dispatching directly
        return stageProcessors.get(stage);
    }
}

(И в качестве примечания: Избегать внедрения поля. )

0
ответ дан chrylis 5 March 2019 в 16:44
поделиться

Это полностью основано на идее @chrylis, просто процессорам не нужно менять свой API для этого, вы можете просто сделать это с аннотацией. Также есть случай, когда у вас есть несколько процессоров для одного типа.

interface StageProcessor {
    OutputType process(Stage stage);
}

@Component
@Processes(StageType.A)
class StageProcessorA implements StageProcessor{
      OutputType process(Stage stage){
        //validate stage is StageType.A
      }
}

@interface Processes{
    StageType type;
    StageType getType(){
        return type;
    }
}

@Component
@Processes(StageType.B)
class StageProcessorB implements StageProcessor{

}

@Service
class StageProcessors {
    Map<StageType, List<StageProcessor>> stageProcessors;

    StageProcessors(Collection<StageProcessor> processors) {
        Map<StageType, List<StageProcessor>> map = new HashMap<>();
        for (StageProcessor processor : processors) {
            StageType stageType = processor.getClass().getAnnotation(Processes.class).getType();
            map.computeIfAbsent(stageType, k -> new ArrayList<>()).add(processor);
        }
        stageProcessors = map;
        assert stageProcessors.size() == expectedNumberOfProcessors;
    }

    List<StageProcessor> getProcessors(StageType stage) {
        return stageProcessors.get(stage);
    }
}
0
ответ дан GabiM 5 March 2019 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: