为啥当参数以(.pl)结尾时,Spring MVC @RequestMapping 会为映射(/user/username:.+)抛出 406 错误
Posted
技术标签:
【中文标题】为啥当参数以(.pl)结尾时,Spring MVC @RequestMapping 会为映射(/user/username:.+)抛出 406 错误【英文标题】:Why does Spring MVC @RequestMapping throws 406 error for mapping (/user/username:.+) when parameter ends with (.pl)为什么当参数以(.pl)结尾时,Spring MVC @RequestMapping 会为映射(/user/username:.+)抛出 406 错误 【发布时间】:2015-04-11 23:27:18 【问题描述】:@RequestMapping(value = "/user/username:.+", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
User user(@PathVariable String username)
User user = userRepository.findByUsername(username);
if (user == null)
throw new UserNotFoundException("User not found");
return user;
这是表示该操作的方法。控制器用@RestController
注解
已解决
内容类型协商机制应该被覆盖。
探索:http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc
代码:
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer)
configurer.mediaType("pl", MediaType.APPLICATION_JSON);
【问题讨论】:
看看这个 [链接] (***.com/questions/7462202/…) 【参考方案1】:更新答案
PathMatchConfigurer
正在尝试将每个 /controller/path.* 与每个后缀匹配,并尝试使用 ContentNegotiationManager
查找内容类型。您可以通过禁用此功能或仅在 .* 是注册后缀时尝试更改此行为。见这里:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-config-path-matching
您应该调用pathMatchConfigurer.setUseRegisteredSuffixPatternMatch(true)
或pathMatchConfigurer. setUseSuffixPatternMatch(false)
旧答案:)
我认为 Spring MVC 错误地认为 .pl 是一个扩展,并为此媒体类型查找 HTTPMessageConverter。在这种情况下,在此处创建转换器没有意义,但也许将其标记为不同的媒体类型会起作用吗?不过,我认为这只是一种解决方法。
我还认为您的 @RequestMapping
值可能很简单:value = "/user/username"
- 您正在使用 RegEx .+ 作为您的用户名变量,这实际上意味着您无论如何都匹配整个模式。
【讨论】:
value = "/user/username" 将修剪 "." 之后的所有内容以上是关于为啥当参数以(.pl)结尾时,Spring MVC @RequestMapping 会为映射(/user/username:.+)抛出 406 错误的主要内容,如果未能解决你的问题,请参考以下文章