Передача пути URI провайдерам JAX-RS - PullRequest
3 голосов
/ 14 июля 2010

Я недавно внедрил сервис Джерси JAX-RS Rest. Я создал JIBX-провайдер, который позволяет демаршировать и маршалировать между типами XML и Java. Я также хотел бы создать версию своего сервиса, указав версию в URL-пути. Управление версиями будет включать версию привязки сообщений, используемую для маршалинга и демаршаллинга типов Java.

Следовательно, необходимо, чтобы версия передавалась пользовательскому провайдеру JIBX, и, следовательно, URL-путь, содержащий версию. Однако интерфейсы провайдера (MessageBodyWriter и MessageBodyReader) не предоставляют путь URI в своих методах интерфейса.

Ниже приведена сигнатура метода writeTo() интерфейса MessageBodyWriter:

writeTo(Object, Type, Annotation[], MediaType, MultivaluedMap, OutputStream)

Параметры этого метода не содержат путь uri, поэтому пользовательский поставщик jibx не может знать, какую версию привязки сообщений он должен использовать для маршалинга типа Java. Это можно обойти?

Ответы [ 2 ]

9 голосов
/ 23 июля 2010

Если вы хотите что-то более специфичное для JAX-RS, чем HttpServletRequest, вы можете добавить javax.ws.rs.core.UriInfo.

public class MyProvider implements MessageBodyWriter {
    @javax.ws.rs.core.Context
    javax.ws.rs.core.UriInfo uriInfo;
}

Я предполагаю, что вы используете@ javax.ws.rs.PathParam для захвата параметра пути.Затем вы можете потенциально использовать UriInfo.getPathParameters ().Вы также можете воспользоваться UriInfo.getPathSegments (), чтобы получить информацию, которую вы ищете.Это избавит вас от необходимости самостоятельно анализировать URI запроса.Любая реализация JAX-RS должна быть в состоянии сделать это.

0 голосов
/ 14 июля 2010

Вы можете получить доступ к пути URI из провайдера, определив аннотацию @Context в поле провайдера.

Например,

public class CustomProvider implements MessageBodyWriter
{

    @Context HttpServletRequest request;

    ....
}

Это поле будет установлено автоматическиза каждый запрос.Несмотря на то, что запрос задан как поле, значение является поточно-ориентированным, так как фактический запрос использует прокси и, скорее всего, локальный поток для определения запроса, который принадлежит потоку.

...