Сопоставление запроса Spring с другим методом для определенного значения переменной пути
@Controller
@RequestMapping("/authors")
public class AuthorController {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public Author getAuthor(
final HttpServletRequest request,
final HttpServletResponse response,
@PathVariable final String id)
{
// Returns a single Author by id
return null;
}
@RequestMapping(value = "/{id}/author-properties", method = RequestMethod.GET)
public AuthorProperties getAuthorProperties(
final HttpServletRequest request,
final HttpServletResponse response,
@PathVariable final String id)
{
// Returns a single Author's List of properties
return null;
}
@RequestMapping // How to map /authors/*/author-properties to this method ????
public List<AuthorProperties> listAuthorProperties(
final HttpServletRequest request,
final HttpServletResponse response)
{
// Returns a single Author's List of properties
return null;
}
}
class Author {
String propertiesUri;
// other fields
}
class AuthorProperties {
String authorUri;
// other fields
}
В основном мне нужно:
- / авторы - список всех авторов
- / авторы /123 - выборка автора по идентификатору 123
- / авторы /123/author-properties - получение объекта AuthorProperties для автора 123
- / авторы /*/author-properties - получение списка AuthorProperties для всех авторов
Когда я пытался
@RequestMapping(value = "/*/author-properties", method = RequestMethod.GET)
Это было еще картирование /authors/*/author-properties
метод getAuthorProperties со значением переменной пути в виде "*".
3 ответа
Посмотрите, работает ли это
@RequestMapping(value = "/{id:.*}/author-properties", method = RequestMethod.GET)
Вы можете ограничить отображение для отдельного автора с помощью регулярных выражений, таких как:
@RequestMapping("/{authorId:\\d+}/author-properties")
public String authorProperties(@PathVariable String authorId) {}
Это будет соответствовать только тем URL-адресам, где идентификатор автора является числовым.
Для запроса всех свойств автора вы можете использовать:
@RequestMapping("/*/author-properties")
public String allProperties() { }
Hovewer *
имеет особое значение, поэтому оно будет соответствовать /foo/author-properties
также. Чтобы обойти это, вы можете использовать что-то вроде:
@RequestMapping("/{all:\\*}/author-properties")
public String allProperties() { }
Если выборка List of AuthorProperties для всех авторов является обычным случаем, то я думаю, что вы должны создать URI, например, так: "/author-properties". В противном случае ответ Богуслава, что вы хотите.