RESTEasy JAX-RS динамическая диспетчеризация, кроме субресурсов - PullRequest
4 голосов
/ 05 июля 2011

RESTEasy (JAX-RS) позволяет динамическую диспетчеризацию через подресурсы.Например:

POST /customers/create
{"name":"Smith","country":"jp"}

У нас может быть корневой ресурс для обработки пути "/ Customers" с помощью метода, аннотированного без метода HTTP, но с помощью @Path ("/ create").Этот метод возвращает ресурс, на который смотрит JAX-RS, чтобы продолжить обработку запроса.Однако этот ресурс должен обрабатывать путь "/ Customers / Create".

У меня есть ситуация, в которой могут быть созданы различные типы объектов:

POST /customers/create
{"name":"Smith"}

POST /locations/create
{"name":"Chicago"}

Я хотел бы добавитьвозможность создания любого вида сущности на основе дополнительного свойства в теле запроса:

POST /entities/create
{"type":"customer","name":"Smith"}

По сути, я хочу перенаправить запрос в код, который обрабатывает "POST / Customers / Create".Я могу написать локатор подресурса, который вызывается для «POST / entity / create» и возвращает ресурс Customer, но JAX-RS не может отправить запрос, потому что ресурс Customer не обрабатывает путь «/ entity / create».Можно ли изменить URL-адрес на / Customers / Create при пересылке запроса?

На данный момент я не могу изменить API, чтобы сделать "клиенты" настоящим подресурсом "сущностей".

Ответы [ 2 ]

5 голосов
/ 20 августа 2014

Если вы используете RestEasy 3, которая реализует JAX-RS 2.0, то вы можете попробовать использовать ContainerRequestFilter с пометкой @Provider @PreMatching.

В этом фильтре вы можете вызвать метод ContainerRequestContext#setRequestUri(URI), чтобы изменить URI запроса на основе содержимого запроса и, таким образом, перейти от /entities/create к /customers/create или /locations/create.Аннотация @PreMatching означает, что Фильтр будет вызываться до того, как будет сопоставлен целевой метод ресурса, поэтому здесь вы сможете выполнить перенаправление.

(Вы можете даже заменитьсодержимое запроса, например: {"type":"customer","name":"Smith"} -> {"name":"Smith"} с использованием методов ContainerRequestContext#getInputStream() и ContainerRequestContext#setInputStream(InputStream))

HTH Xavier

0 голосов
/ 20 августа 2014

Я сомневаюсь, что существует стандартный способ JAX-RS изменить URL-адрес перед возвратом подресурса. Но у меня есть возможное решение вашей проблемы.

Определите этот ресурс общего отдыха следующим образом: POST /entities/{entityType}. В зависимости от параметра пути entityType вы можете напрямую решить, какой субресурс вы можете создать (например, используя статический Map<String, Class<?>> для хранения путей к объектам)

...