当一个@Controller扩展另一个@Controller时,“发现歧义映射”

我有一个ImportAction用作多个特定于类型的导入控制器(例如ImportClientsAction和)的父类的类ImportServicesAction

ImportAction是带有Spring MVC注释的@Controller类,并具有-

带注释的@RequestMapping方法,以拉出导入选项菜单并输入每个特定于类型的导入控制器。

例如,每个子类ImportClientsAction也都进行了注释,@Controller并且@RequestMapping针对其类型的特定导入过程具有特定于类型的。

在没有@RequestMapping任何以往任何时候都应该与父母或相互碰撞子类的S; 每个都有不同的路径/值和不同的参数。

从我在这样的问题遇到这一个和这一个,这听起来像春天计算每个子类为具有父类的重复@RequestMapping-annotated方法,即使孩子类没有重载父的方法。

有没有一种方法可以让@Controller带有@RequestMappings的带有注释的父类,以及带有@Controller注释的子类,而Spring却不认为子类与父类的带有@RequestMapping注释的方法重复呢?

额外的问题,为什么Spring无法@RequestMapping在子类上识别出“重复项”,而只忽略父类的所有版本?难道这根本就没有实现,还是Java中存在一个根本的问题使之不可能?


编辑:示例代码

父类示例:

@Controller

public 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 */

}

子类示例:

@Controller

public 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使用错误实例的方式有很多:

  1. 子级将覆盖父级的方法。它甚至不必重写映射方法,只需重写从映射方法调用的方法即可。子实例的行为与父实例的行为不同,因此它们不能具有相同的映射。
  2. 该类具有非静态字段。即使两个bean是同一类,这也适用。一个实例/ bean可以具有不同的值,因此由于实例字段的值而具有不同的行为。

由于这些问题(可能还有其他几个问题),即使映射到的方法是同一方法,Spring也无法忽略或解决重复映射。

在一个相关的问题中,我尝试通过制作带@RequestMapping注释的方法来解决此问题static。问题1仍然适用,因此仅使每种映射方法static都无法解决或解决该问题。

以上是 当一个@Controller扩展另一个@Controller时,“发现歧义映射” 的全部内容, 来源链接: utcz.com/qa/403720.html

回到顶部