带有@PathVariable的Spring MVC带注释的控制器接口
有没有理由不将Controller映射为接口?
在所有的示例和问题中,我看到了周围的控制器,都是具体的类。是否有一个原因?我想将请求映射与实现分开。但是,当我尝试@PathVariable
在具体类中获取a 作为参数时,我碰壁了。
我的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);
}
And the implementing class:
@Componentpublic 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
注释的东西处理吗?
回答:
显然,当请求模式通过@RequestMapping
注释映射到方法时,它就会映射到具体的方法实现。因此,与声明匹配的请求将GoalServiceImpl.removeGoal()
直接调用,而不是最初声明@RequestMappingie
的方法GoalService.removeGoal()
。
由于接口,接口方法或接口方法参数上的注释不会延续到实现中,因此@PathVariable
除非实现类明确声明,否则Spring MVC无法将其识别为。如果没有它,@PathVariable
将不会执行任何针对参数的AOP建议。
以上是 带有@PathVariable的Spring MVC带注释的控制器接口 的全部内容, 来源链接: utcz.com/qa/408670.html