为啥当参数以(.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 错误的主要内容,如果未能解决你的问题,请参考以下文章

spring MVC 怎么获取前端传递的数组参数

为啥在PL/Sql程序运行时打印新旧值。?

为啥浏览器 URL 不能以 .com 结尾?

spring mvc中如何过滤form提交数据中的空格?

java为啥不到文件结尾就自动结束了?

Spring MVC 重定向在 url 中添加了一些参数