Есть ли причина не отображать контроллеры как интерфейсы?
Во всех примерах и вопросах, которые я вижу, окружающие контроллеры, все являются конкретными классами. Для этого есть причина? Я хотел бы отделить сопоставления запросов от реализации. Я наткнулся на стену, когда попытался получить @PathVariable
в качестве параметра в моем конкретном классе.
Интерфейс My Controller выглядит так:
@Controller
@RequestMapping("/services/goal/")
public interface GoalService {
@RequestMapping("options/")
@ResponseBody
Map<String, Long> getGoals();
@RequestMapping(value = "{id}/", method = RequestMethod.DELETE)
@ResponseBody
void removeGoal(@PathVariable String id);
}
И реализующий класс:
@Component
public class GoalServiceImpl implements GoalService {
/* init code */
public Map<String, Long> getGoals() {
/* method code */
return map;
}
public void removeGoal(String id) {
Goal goal = goalDao.findByPrimaryKey(Long.parseLong(id));
goalDao.remove(goal);
}
}
Метод getGoals ()
отлично работает; removeGoal (String id)
выдает исключение
ExceptionHandlerExceptionResolver - Resolving exception from handler [public void
todo.webapp.controllers.services.GoalServiceImpl.removeGoal(java.lang.String)]:
org.springframework.web.bind.MissingServletRequestParameterException: Required
String parameter 'id' is not present
Если я добавляю аннотацию @PathVariable
к конкретному классу, все работает, как ожидалось, но почему я должен повторно объявлять это в конкретном классе? Разве это не должно обрабатываться тем, что имеет аннотацию @Controller
?