Spring MVC: правильная аннотация метода контроллера для RESTful URI, включая ';' - PullRequest
0 голосов
/ 22 сентября 2010

При разработке моего RESTful API я хотел бы использовать следующий URI

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

, например

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 Ответ

2 голосов
/ 22 сентября 2010

В вашем шаблоне URI есть две проблемы:

  • Некоторые контейнеры сервлетов могут обрабатывать ; как разделитель и обрезать URI (например, ошибка Tomcat 30535 ). Таким образом, в качестве обходного пути вы можете использовать какой-то другой символ, например ,.
  • По умолчанию Spring MVC обрабатывает точку в URI как разделитель расширений и также обрезает ее. Вы можете переопределить его, указав шаблон регулярного выражения для переменной пути.

Итак, у вас будет что-то вроде

@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 с, поэтому он используется только для проверки.

...