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

Какой хороший способ структурировать весенние веб-контроллеры, когда есть разные веб-страницы, которые имеют общие функции?

Допустим, есть Tasks и Task страница интернета. Я могу запустить задачу с обеих страниц, и я ожидаю, что при этом я останусь на той же странице.

Какой лучший способ сделать это? Я вынужден дублировать логику следующим образом:

@Controller
@RequestMapping("/tasks")
public class TasksController {

    @GetMapping("/{id}/start")
    public String start(@PathVariable String id) {
        tasks.start(id);
        return "redirect:/tasks.html";
    }
}

а также

@Controller
@RequestMapping("/task")
public class TaskController {

    @GetMapping("/{id}/start")
    public String start(@PathVariable String id) {
        tasks.start(id);
        return "redirect:/task.html";
    }
}

пс. Я не заинтересован в асинхронных решениях JavaScipt.

2 ответа

Решение

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

@Controller
public class TaskController {

    ...

    @GetMapping({"/{page:tasks?}/{id}/start")
    public String start(@PathVariable String page, @PathVariable String id) {
        tasks.start(id);
        return "redirect:/" + page + ".html";
    }
}

Если логики больше или точки входа совсем другие, извлеките общий код для сервиса.

Моя мысль: это всего лишь вопрос того, как ваш дизайн и названия контроллеров. В идеале я создаю один контроллер для каждого объекта бизнес-домена. вместо создания контроллеров для каждой страницы. Если мы назовем Controller и Services для каждого объекта бизнес-домена, этого можно избежать. Так что я бы просто имел TaskController и вызывал один и тот же URI независимо от того, где вы вызываете его: со страницы Task, TaskDetail page или TaskReport page.

Другие вопросы по тегам