当参数以(.pl)结尾时,为什么Spring MVC @RequestMapping会因映射(/user/{username:.+})而抛出406错误

时间:2015-02-11 14:36:47

标签: java spring spring-mvc spring-boot

@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

解决

应覆盖内容类型协商机制。

Explonation:http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc

代码:

@Override
  public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.mediaType("pl", MediaType.APPLICATION_JSON);
  }

1 个答案:

答案 0 :(得分:4)

更新回答

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。+作为您的用户名变量,这实际上意味着您仍然匹配整个模式。