У меня есть реализация сервера RESTful, а также библиотека для клиентов для выполнения вызовов, все с использованием JAX-RS. Компоненты сервера разделены на интерфейс FooResource
и реализацию FooResourceService
.
Для того, чтобы библиотеки клиентов и серверов могли совместно использовать путь RESTful и другие определения, я хотел разделить интерфейс FooResource
в своем собственном проекте:
@Path(value = "foo")
public interface FooResource {
@GET
public Bar getBar(@PathParam(value = "{id}") int id) {
Я хочу установить некоторые заголовки в ответе. Один простой способ сделать это - использовать @Context HttpServletResponse
в сигнатуре метода:
public Bar getBar(@PathParam(value = "{id}") int id, @Context HttpServletResponse servletResponse) {
Но проблема в том, что это предоставляет детали реализации в интерфейсе. Более конкретно, внезапно требуется, чтобы мой проект определения REST (который делится между клиентской и серверной библиотекой), чтобы задействовать зависимость javax.servlet-api
- то, что клиент не нуждается (или желает).
Как моя реализация RESTful-ресурса может устанавливать заголовки HTTP-ответов, не втягивая эту зависимость в интерфейс ресурсов?
Я видел одно сообщение, рекомендующее вводить HttpServletResponse как член класса. Но как это будет работать, если моя реализация службы ресурсов является одноэлементной? Использует ли он какой-то прокси-сервер с локалями потоков или что-то, что определяет правильный ответ сервлета, хотя одноэлементный класс используется одновременно несколькими потоками? Есть ли другие решения?