gpt4 book ai didi

带有 @PathVariable 的 Spring MVC 带注释的 Controller 接口(interface)

转载 作者:IT老高 更新时间:2023-10-28 13:05:03 26 4
gpt4 key购买 nike

有什么理由不将 Controller 映射为接口(interface)?

在我看到的围绕 Controller 的所有示例和问题中,都是具体的类。是否有一个原因?我想将请求映射与实现分开。但是,当我尝试将 @PathVariable 作为具体类中的参数时,我碰壁了。

我的 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 注释的任何东西处理吗?

最佳答案

显然,当请求模式通过 @RequestMapping 映射到方法时注解,它被映射到具体的方法实现。因此,与声明匹配的请求将调用 GoalServiceImpl.removeGoal()直接而不是最初声明 @RequestMapping 的方法即GoalService.removeGoal() .

由于接口(interface)、接口(interface)方法或接口(interface)方法参数上的注释不会延续到实现中,因此 Spring MVC 无法将其识别为 @PathVariable除非实现类明确声明它。没有它,任何针对 @PathVariable 的 AOP 建议参数不会被执行。

关于带有 @PathVariable 的 Spring MVC 带注释的 Controller 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8002514/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com