如何解决Spring MVC中的多映射问题?

时间:2014-03-14 13:58:29

标签: spring spring-mvc spring-security

在我的控制器中,我有两种处理来自用户请求的方法。

@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。在我的逻辑中是否有任何映射请求的解决方案?

2 个答案:

答案 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