Spring MVC:RESTful URI控制器方法的正确注释,包括';'

时间:2010-09-22 17:00:34

标签: java rest spring-mvc restful-url

设计我的RESTful API,我想使用以下URI

http://[HOST]/[PLANET]/[LAT];[LONG]

e.g。

http://myserver/earth/50.2;29.1

Spring MVC中这种方法的适当注释是什么?这是下一个好吗?

@RequestMapping(value = "/{planet}/{lat};{long}", method = RequestMethod.GET)
public String showInfoAboutCoords(
  @PathVariable final String planet, 
  @PathVariable final String lat,
  @PathVariable final String long, 
  final HttpServletResponse response) {
        // Implementation
}

如果这个没问题 - @MaskFormat("###-##-####")有什么用?

1 个答案:

答案 0 :(得分:2)

您的URI模式有两个问题:

  • 某些servlet容器可能会将;视为分隔符并修剪URI(例如Tomcat的bug 30535)。因此,作为一种解决方法,您可以使用一些不同的角色,例如,
  • 默认情况下,Spring MVC将URI中的点视为扩展分隔符并对其进行修剪。您可以通过为路径变量指定regexp模式来覆盖它。

所以,你会有像

这样的东西
@RequestMapping(value = "/{planet}/{lat:.*},{long:.*}", method = RequestMethod.GET) 

请注意,由于您禁用了Spring的扩展处理,因此您必须在需要时手动启用它(这也需要更严格的正则表达式,以避免将小数点与扩展分隔符混淆):

@RequestMapping(value = 
    {"/{planet}/{lat:.*},{long:\\d+\\.\\d+}", 
         "/{planet}/{lat:.*},{long:\\d+\\.\\d+}.*"}, 
    method = RequestMethod.GET)

通过@MaskFormat,您可能意味着来自mvc-showcase的注释(请注意,它注意到内置注释)。与MaskFormatAnnotationFormatterFactory一起,它演示了将路径变量(即字符串)转换为方法参数的新格式设施。实际上它会将String转换为String s,因此它仅用于验证。