我有一个ImportAction
类,用作多个特定于类型的导入控制器的父类,例如ImportClientsAction
and ImportServicesAction
.
ImportAction
是一个带有注释的 Spring MVC@Controller
类并且有@RequestMapping
-带注释的方法,用于拉出导入选项菜单并输入每个特定于类型的导入控制器。
每个儿童班级,例如ImportClientsAction
还注释了@Controller
并且具有特定于类型的@RequestMapping
s 其类型的特定导入过程。
没有任何一个@RequestMapping
任何子类中的 s 都应该与父类或彼此之间发生碰撞;每个都有不同的路径/值和不同的参数。
从我遇到的问题来看this one and this one,听起来 Spring 将每个子类都视为具有父类的副本@RequestMapping
- 带注释的方法,即使子类不重写父类的方法。
有没有办法有一个@Controller
- 带注释的父类@RequestMapping
s,并且有@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 */
}