Сопоставление запроса 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". В противном случае ответ Богуслава, что вы хотите.

Другие вопросы по тегам