我不知道如何在不被否决10次的情况下提出这个问题,而且很清楚,但是事情已经过去了。我有一个rest控制器类,其中许多端点根据操作对书进行某些操作。
我的问题是一个设计问题,如何最好地从抽象控制器类(handleRequest方法)中获取所有特定于动作的业务逻辑?[[out?我考虑的选项之一是GOF模板模式,可以很好地适合这里。问题是我不想为每种动作类型创建不同的空实现类。也许%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 .. } }
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() }
您可以使用功能界面定义动作的行为
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)
}