Несколько классов JAX-RS с одним и тем же путем

С JAX-RS, возможно ли иметь более одного класса, назначенного одному пути? Я пытаюсь сделать что-то вроде этого:

@Path("/foo")
public class GetHandler {
    @GET
    public Response handleGet() { ...
}

@Path("/foo")
public class PostHandler {
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response handlePost() { ...
}

По-видимому, это недопустимо, поскольку я получаю:

com.sun.jersey.api.container.ContainerException: A root resource, class PostHandler, has a non-unique URI template /foo

Я всегда могу создать один класс для обработки запросов, а затем делегировать вспомогательные классы. Я надеялся, что есть стандартный способ сделать это.

Ответ 1

Спецификация JAX-RS не запрещает такое отображение. Например, для реализации JAX-RS Resteasy. Особенность должна быть специфичной для трикотажа.

Относительно:

Я всегда могу создать один класс для обработки запросов, а затем делегировать вспомогательные классы. Я надеялся, что есть стандартный способ сделать это.

Обычно у вас есть классы ресурсов с тем же именем, что и путь:

@Path("/foo")
public class FooResource {
    @GET
    @Path("/{someFooId}")
    public Response handleGet() {
      ...
    }

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public Response handlePost() {
       ...
    }
}

Ответ 2

Вы не можете иметь несколько ресурсов, сопоставленных с одним и тем же путем. Я попробовал это несколько дней назад и приземлился с такой же ошибкой.

Я закончил работу с субпакетами, такими как /api/contacts для одного ресурса и /api/tags для другого.

Единственный длинный путь - создать ресурсы в нескольких пакетах, а затем создать для каждого приложения разные приложения.

Ответ 3

У меня была похожая проблема: создание аннотации @PATH уровня класса для пустой строки и перемещение имени ресурса на аннотацию @PATH уровня метода решило эту проблему.

@Path("")
public class GetHandler {
  @GET
  @Path("/foo")
  public Response handleGet() {
    // impl
  }
}

@Path("")
public class PostHandler {
  @POST
  @Path("/foo")
  @Consumes(MediaType.APPLICATION_JSON)
  public Response handlePost() {
    // impl
  }
}