在我的控制器中,我有两种处理来自用户请求的方法。
@RequestMapping(method = RequestMethod.GET)
@PreAuthorize("hasRole('ROLE_INTERNAL_USER')")
public String homeInt() {
return "redirect:/internal";
}
@RequestMapping(method = RequestMethod.GET)
@PreAuthorize("hasRole('ROLE_EXTERNAL_USER')")
public String homeExt() {
return "redirect:/external";
}
例外:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#0': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'loginController' bean method
public java.lang.String de.mark.project.web.controller.LoginController.homeInt()
to {[/],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}: There is already 'loginController' bean method
public java.lang.String de.mark.project.web.controller.LoginController.homeExt() mapped.
但问题是两种方法都无法映射到一个请求方法或一个URI。在我的逻辑中是否有任何映射请求的解决方案?
答案 0 :(得分:1)
您需要为方法分配不同的上下文路径:
@RequestMapping(value="/path1", method = RequestMethod.GET)
public String homeInt() {
...
}
@RequestMapping(value="/path2", method = RequestMethod.GET)
public String homeExt() {
...
}
或者为这两个请求分配不同的HTTP谓词:
@RequestMapping(method = RequestMethod.GET)
public String homeInt() {
...
}
@RequestMapping(method = RequestMethod.POST)
public String homeExt() {
...
}
否则从HTTP的角度来看,无法知道选择哪种方法,这就是错误消息的含义:在它的当前形式中,这两种方法定义是不明确的,因为它们具有相同的上下文路径,动词。
另一种方法是只编写一个方法,如果可能,决定方法体:
@RequestMapping(value="/path1", method = RequestMethod.GET)
public String homeIntOrExt() {
if (... some condition ...) {
return "redirect:/internal";
}
else {
return "redirect:/external";
}
}
答案 1 :(得分:0)
虽然Spring使用RequestConditions和自定义RequestMappingHandlerMapping实现可能会有点神奇。
有关示例,请查看this。