gpt4 book ai didi

java - "Ambiguous mapping found"当一个@Controller 扩展另一个@Controller

转载 作者:行者123 更新时间:2023-11-30 06:59:27 25 4
gpt4 key购买 nike

我有一个 ImportAction 类,它作为几个特定类型导入 Controller 的父类,例如 ImportClientsActionImportServicesAction

ImportAction 是一个 Spring MVC 注释的 @Controller 类,并且具有 @RequestMapping 注释的方法来拉出导入选项菜单并输入每个特定类型的导入 Controller 。

每个子类,例如ImportClientsAction 也被注释为 @Controller 并且具有类型特定的 @RequestMapping 用于其类型的特定导入过程。

任何子类中的 @RequestMapping 都不应该与父类或彼此发生冲突;每个都有不同的路径/值和不同的参数。

根据我在 this one 等问题中遇到的问题和 this one ,听起来 Spring 将每个子类都视为具有父类的 @RequestMapping 注释方法的副本,即使子类没有覆盖父类的方法也是如此。

有没有办法让一个带有@RequestMapping@Controller注解的父类,以及带有@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,然后该类的实例(即那个 bean)用于调用 @RequestMapping -根据用户向 servlet 发出请求时提供的映射标注的方法。

当您有两个带有 @Controller 注释的类时,一个是另一个的子类,子类会再次尝试在父类上注册映射。 “没什么大不了的!”你说。问题是 Spring 无法明确决定使用哪个实例来调用映射的方法,即使它是完全相同的方法。

如果您注册两个相同类型/类的 bean,同样的问题也会出现,这两个 bean 都尝试注册相同的映射。

Spring 使用错误的实例有几种方式会产生问题:

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

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

related question 中,我尝试通过使 @RequestMapping 注释方法成为 static 来解决这个问题。问题 1 仍然存在,因此简单地使每个映射方法成为 static 并不能解决或解决问题。

关于java - "Ambiguous mapping found"当一个@Controller 扩展另一个@Controller,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31571336/

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