2

从 XML 设置转移到 JavaConfig 设置后,我们的许多 RequestMappings 已经损坏,现在返回模棱两可的方法错误。我们的方法依赖于带有正则表达式的@PathVariable 来确定调用哪个。例如:

@RequestMapping(value={"/{id:\\d+}/boats"})
public String getBoatsById(@PathVariable("id") Long id, Model model,
HttpServletRequest request) throws Exception {...}

@RequestMapping(value={"/{id}/boats"})
public String getBoatsByName(@PathVariable("id") String id, Model model,
HttpServletRequest request) throws Exception {...}

这可以正常工作,但使用新的 JavaConfig 设置与 XML 设置相比,它会因映射而出现模棱两可的错误。

JavaConfig 类开始如下:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example", excludeFilters = { @ComponentScan.Filter( Configuration.class ) })
public class WebConfig extends WebMvcConfigurationSupport

它与使用 AnnotationMethodHandlerAdapter 的 XML 设置与现在使用推荐的 RequestMappingHandlerAdapter 的 JavaConfig 类有什么关系吗?有没有我缺少的设置?

4

1 回答 1

0

刚刚浏览了源代码,AnnotationMethodHandlerAdapter使用了RequestMappingInfo不同于RequestMappingHandlerAdapter. 前者在检查相等性时忽略您指定的模式/路径,而后者尊重它。这就是为什么你有模棱两可的映射错误。不确定这是否是一个错误,可能最好问问 spring-contrib 邮件列表中的人。

编辑

更改映射可能是个好主意。{name:reg_exp}引入语法不是为了解决歧义。摘自官方文档:

有时您需要更精确地定义 URI 模板变量。考虑 URL“/spring-web/spring-web-3.0.5.jar”。您如何将其分解为多个部分?

@RequestMapping 注解支持在 URI 模板变量中使用正则表达式。语法是 {varName:regex} 其中第一部分定义变量名,第二部分定义正则表达式。例如:

@RequestMapping("/spring-web/{symbolicName:[az-]+}-{版本:\d\.\d\.\d}{extension:\.[az]+}")
公共无效句柄(@PathVariable 字符串版本,@PathVariable 字符串扩展){
    // ...
} }

您的处理程序方法从一开始就模棱两可,您只提供了一种解决歧义的黑客方法。

于 2013-04-12T08:00:02.163 回答