Spring MVC:迁移到JavaConfig后的模糊RequestMappings

时间:2013-04-04 13:17:40

标签: spring spring-mvc annotations ambiguous

从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与现在使用推荐的RequestMappingHandlerAdapter的JavaConfig类进行XML设置有什么关系吗?我缺少一个设置吗?

1 个答案:

答案 0 :(得分:0)

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

修改

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

  

有时您需要更精确地定义URI模板变量。   考虑URL“/spring-web/spring-web-3.0.5.jar”。你怎么打破   它分为多个部分?

     

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

     

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}{extension:\.[a-z]+}")
public void handle(@PathVariable String version, @PathVariable String extension) {
    // ...
} }

你的处理程序方法从一开始就含糊不清,你只提供了一种解决模糊性的hackish方法。