5

如果我在类中使用多级 url,我会收到以下异常@RequestMapping("/api/v0.1")

java.lang.IllegalStateException: Ambiguous mapping found. Cannot map 'userController'
bean method getUsers()|to {[/api/v0.1]}: There is already 'userController' bean
method getUser(java.lang.String) mapped.

就像根本没有考虑方法级别的映射一样。但是,如果我把即删除部分
也没关系。@RequestMapping("/api")/v0.1

这是剥离到最小情况的配置:

@Controller
@RequestMapping("/api/v0.1")
public class UserController {   

    @RequestMapping(value = "/users")
    @ResponseBody
    public List<User> getUsers() {
        return null;
    }

    @RequestMapping(value = "/users/{username}")
    @ResponseBody
    public User getUser(@PathVariable String username) {
        return null;
    }
}

web.xml

<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

servlet-context.xml:

<!-- Configures the @Controller programming model -->
<mvc:annotation-driven />

<!-- Forwards requests to the "/" resource to the "welcome" view -->
<mvc:view-controller path="/" view-name="home"/>    

<!-- Handles HTTP GET requests for /assets/** by efficiently serving up static resources in the ${webappRoot}/resources/ directory -->
<mvc:resources mapping="/assets/**" location="/assets/" />

我正在使用弹簧 3.1。我还尝试将beanalwaysUseFullPath的属性设置为 true,RequestMappingHandlerMapping但并没有改变这种情况。

4

2 回答 2

2

非常有趣的问题 - 我检查了可能发生的事情,你说得对,“v0.1”真的抛弃了org.springframework.util.AntPathMatcher它,它通过结合来自控制器的路径和来自映射方法的路径来创建完整的 URI 路径。如果它在控制器中看到“file.extension”类型的模式,那么它会完全忽略该方法的路径映射——这就是你@PathVariable被忽略的原因。

我不确定这是否是 Spring MVC 中的错误或预期行为,临时修复将与您已经提到的一致 -

1.从Controller的RequestMapping中删除“v0.1”并使其不带扩展名v0_1

2.将此映射放在映射方法中:

@Controller
@RequestMapping("/api")
public class UserController {   

    @RequestMapping(value = "/v0.1/users")
    @ResponseBody
    public List<User> getUsers() {
        return null;
    }

    @RequestMapping(value = "/v0.1/users/{username}")
    @ResponseBody
    public User getUser(@PathVariable String username) {
        return null;
    }
}
于 2012-07-08T12:33:41.477 回答
0

您应该使用@RequestMapping(value = "/{version:.*}/users")来包含点 '.' 在路径变量中

于 2015-04-09T20:12:19.357 回答