Необходимо вызвать один и тот же метод контроллера для разных API - PullRequest
1 голос
/ 31 января 2020

У меня есть 2 API

1. localhost:8080/myservice/foo/1/0/updatesStatus
2. localhost:8080/myservice/bar/1/0/updatesStatus

Мне не разрешено иметь разные контроллеры для каждого API. Так что оба API указывают на один и тот же метод контроллера, где я проверяю if-else, но код выглядит очень плохо, есть ли лучший способ справиться с этим.

@PostMapping(value = UPDATE_STATUS_API_PATH)
public Response updateStatus(@PathVariable("group") String group , @RequestBody UpdateStatusRequest updateStatusRequest, HttpServletRequest request) {
        try {
            if(APIUrl.FOO_GROUP.equals(group)){
               //code spefic to foo
            }
            else{
              //code spefic to bar
            }
            //common code
}

Те же условные проверки также должны быть выполнены на уровне обслуживания. Есть ли способ, которым я могу избежать этой условной проверки, не имея отдельных методов контроллера.

1 Ответ

1 голос
/ 31 января 2020

Я могу подумать об этом.

Создать интерфейс для службы.

public interface UpdateService {
    void updateStatus(UpdateStatusRequest updateStatusRequest);
}

Затем вы создадите различные реализации.

public class FooUpdateService implements UpdateService  {
    void updateStatus(UpdateStatusRequest updateStatusRequest) {
        // foo specific logic
    }
}
public class BarUpdateService implements UpdateService  {
    void updateStatus(UpdateStatusRequest updateStatusRequest) {
        // Bar specific logic
    }
}

Создайте UpdateServiceFactory

public class UpdateServiceFactory {
    @Autowired
    private UpdateService fooUpdateService;

    @Autowired
    private UpdateService fooUpdateService;

    public UpdateService getUpdateService(String group) {
        // Move the if-else logic here
        if(APIUrl.FOO_GROUP.equals(group)){
               return fooUpdateService;
            }
            else{
              //code spefic to bar
              return barUpdateService;
            }
    }
}

Контроллер:

@PostMapping(value = UPDATE_STATUS_API_PATH)
public Response updateStatus(@PathVariable("group") String group , @RequestBody UpdateStatusRequest updateStatusRequest, HttpServletRequest request) {
        updateServiceFactory.getUpdateService(group).updateStatus(updateStatusRequest);
            //common code
}
...