从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设置有什么关系吗?我缺少一个设置吗?
答案 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方法。