Аннотированный интерфейс контроллера Spring MVC с @PathVariable

Есть ли причина не отображать контроллеры как интерфейсы?

Во всех примерах и вопросах, которые я вижу, окружающие контроллеры, все являются конкретными классами. Для этого есть причина? Я хотел бы отделить сопоставления запросов от реализации. Я наткнулся на стену, когда попытался получить @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 ?

38
задан AlikElzin-kilaka 28 December 2017 в 06:31
поделиться