当一个@Controller扩展另一个@Controller时,“发现歧义映射”
我有一个ImportAction
用作多个特定于类型的导入控制器(例如ImportClientsAction
和)的父类的类ImportServicesAction
。
ImportAction
是带有Spring MVC注释的@Controller
类,并具有-
带注释的@RequestMapping
方法,以拉出导入选项菜单并输入每个特定于类型的导入控制器。
例如,每个子类ImportClientsAction
也都进行了注释,@Controller
并且@RequestMapping
针对其类型的特定导入过程具有特定于类型的。
在没有@RequestMapping
任何以往任何时候都应该与父母或相互碰撞子类的S; 每个都有不同的路径/值和不同的参数。
从我在这样的问题遇到这一个和这一个,这听起来像春天计算每个子类为具有父类的重复@RequestMapping
-annotated方法,即使孩子类没有重载父的方法。
有没有一种方法可以让@Controller
带有@RequestMapping
s的带有注释的父类,以及带有@Controller
注释的子类,而Spring却不认为子类与父类的带有@RequestMapping
注释的方法重复呢?
额外的问题,为什么Spring无法@RequestMapping
在子类上识别出“重复项”,而只忽略父类的所有版本?难道这根本就没有实现,还是Java中存在一个根本的问题使之不可能?
编辑:示例代码
父类示例:
@Controllerpublic class ImportAction {
@RequestMapping(value = "/import", params = "m=importMenu", method = RequestMethod.GET)
public String importMenu(HttpServletRequest request) throws Exception {
return TilesConstants.IMPORT_MENU;
}
@RequestMapping(value = "/import", params = "m=importClients", method = RequestMethod.GET)
public String importClients(@ModelAttribute("ImportUploadForm") ImportUploadForm theForm, HttpServletRequest request) throws Exception {
retrieveReturnPage(request);
theForm.setSomeBoolean(true);
return TilesConstants.IMPORT_CLIENTS_UPLOAD;
}
@RequestMapping(value = "/import", params = "m=importServices", method = RequestMethod.GET)
public String importServices(@ModelAttribute("ImportUploadForm") ImportUploadForm theForm, HttpServletRequest request) throws Exception {
retrieveReturnPage(request);
theForm.setSomeBoolean(false);
return TilesConstants.IMPORT_SERVICES_UPLOAD;
}
/* etc 7 more almost identical methods */
}
子类示例:
@Controllerpublic class ImportClientsAction extends ImportAction {
@RequestMapping(value = "/importClients", params = "m=uploadClients", method = RequestMethod.POST)
public String uploadClients(@ModelAttribute("ImportUploadForm") ImportUploadForm theForm, BindingResult errors, HttpServletRequest request) throws Exception {
if (!parseAndStoreUploadedFile(theForm, errors, request)) {
return TilesConstants.IMPORT_CLIENTS_UPLOAD;
}
return "redirect:/importClients?m=enterMapClientsUpload";
}
/* etc other "client" type-specific import methods */
}
回答:
(Sotirios Delimanolis的技巧提示可帮助我学习和理解这一点)
一个带@Controller
注释的类不应扩展另一个带@Controller
注释的类,因为父类的方法也存在于子类上。
每个@Controller
带有注释的类都在Servlet上下文(?)中实例化为一个bean,然后@RequestMapping
根据用户向Servlet请求时提供的映射,使用该类的实例(即该bean)来调用带注释的方法。
。
当您有两个带@Controller
注释的类,一个是另一个的子类时,该子类将尝试第二次在父类上注册映射。“没什么大不了的!”
你说。问题在于,即使完全相同的方法,Spring也无法确定使用哪个 实例 来调用映射方法。
如果您注册两个相同类型/类的Bean,而这两个都尝试注册相同的映射,则会出现相同的问题。
Spring使用错误实例的方式有很多:
- 子级将覆盖父级的方法。它甚至不必重写映射方法,只需重写从映射方法调用的方法即可。子实例的行为与父实例的行为不同,因此它们不能具有相同的映射。
- 该类具有非静态字段。即使两个bean是同一类,这也适用。一个实例/ bean可以具有不同的值,因此由于实例字段的值而具有不同的行为。
由于这些问题(可能还有其他几个问题),即使映射到的方法是同一方法,Spring也无法忽略或解决重复映射。
在一个相关的问题中,我尝试通过制作带@RequestMapping
注释的方法来解决此问题static
。问题1仍然适用,因此仅使每种映射方法static
都无法解决或解决该问题。
以上是 当一个@Controller扩展另一个@Controller时,“发现歧义映射” 的全部内容, 来源链接: utcz.com/qa/403720.html