Как сделать несколько @путей в @GET в API JAX-RS?

#java #api #jax-rs

Вопрос:

Итак, в моем классе ресурсов у меня есть следующее:

 @GET
@Produces(MediaType.APPLICATION_JSON)
public List<Carta> get() {
    return repositorio.getAll();
}

@GET
@Path("{id}")
@Produces(MediaType.APPLICATION_JSON)
public Carta getById(@PathParam("id") int id) {
    return repositorio.getID(id);
}
 

оба работают, один-общий get (получит все), а другой-по идентификатору. Мне нужно добавить третью строку get by, но я не справляюсь с @params. Мне нужно добавить это в класс ресурсов:

 @GET
@Path("{nome}")
@Produces(MediaType.APPLICATION_JSON)
public List<Carta> getNome(@PathParam("nome") String nome) {
    return repositorio.getString(nome);
}
 

если я прокомментирую строки GetById, моя getByString работает, код хороший, мне просто нужно, чтобы обе функции выполнялись одновременно, если он получает номер, он ищет идентификатор, если это строка, он просматривает имя и описание. Кроме того, мне интересно, лучше ли использовать код для создания большего количества конечных точек? Как /поиск/по идентификатору/xx и /поиск/по имени/xxx вместо общего /поиск/xxx? Спасибо.

Комментарии:

1. Вы можете использовать регулярное выражение для различения параметров целочисленного и строкового пути. Что-то вроде @Path("{id : \d }") для целого числа. Вы можете прочитать больше о приоритете URI для ссылки JAX-RS

Ответ №1:

Вместо того, чтобы создавать другую конечную точку, вам следует расширить List<Carta> get() поддержку фильтрации по имени карты.

Ожидаемый способ сделать это-использовать @QueryParam аннотацию следующим образом:

 @GET
@Produces(MediaType.APPLICATION_JSON)
public List<Carta> get(@QueryParam("name") String name) {
    return repositorio.getCartas(name);
}
 

В случае null параметра name Carta будут возвращены все экземпляры.