2010-07-13 10 views
3

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

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

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

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

Этот метод параметры не содержит путь Ури, следовательно, поставщик пользовательских JiBX может не знать, какое сообщение связывающую версию, как надо использовать для сортировки Java-типа. Есть ли способ обойти это?

+0

Исправьте меня, если я ошибаюсь, но Джерси использует JAX-RS, а не JAX-WS – skaffman

+0

О, да, вы правы. обновлено до JAX-RS – onejigtwojig

ответ

8

Если вы хотите что-то более 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

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

Например,

public class CustomProvider implements MessageBodyWriter 
{ 

    @Context HttpServletRequest request; 

    .... 
} 

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