2010-10-12 4 views
6

У меня есть несколько классов, открытых как JAX-RS запрос «обработчики», используя аннотации javax.ws.rs.Path. Я хочу добавить определенные действия перед каждым запросом и после каждого запроса. Кроме того, мне нужно создать глобальный обработчик исключений приложений, который поймает все брошенные этими обработчиками и протоколом.Могу ли я обернуть все запросы JAX-RS специальным кодом предварительной отправки, отправки и обработки ошибок?

Можно ли достичь этого со стандартным JAX-RS без создания пользовательского класса, унаследованного от com.sun.jersey.spi.container.servlet.ServletContainer (я использую Джерси).

+0

Принятый ответ не адрес вашей желание иметь предварительные и последующие действия. Вы когда-нибудь пришли к решению? –

+0

Пользовательский [Сервлет-фильтр] (http://download.oracle.com/javaee/5/api/javax/servlet/Filter.html) - это путь. – yegor256

ответ

2

Вы также можете использовать ExceptionMappers. Этот механизм, который поймать исключение брошено вашей службы и преобразовать его в соответствующий ответ:

@Provider 
public class PersistenceMapper implements ExceptionMapper<PersistenceException> { 

    @Override 
    public Response toResponse(PersistenceException arg0) { 
     if(arg0.getCause() instanceof InvalidDataException) { 
      return Response.status(Response.Status.BAD_REQUEST).build(); 
     } else { 
      ... 
     } 
    } 

} 

Для получения дополнительной информации см:

0

Вы можете использовать filters, чтобы читать и изменять все запросы и ответы.

+0

Похоже, что фильтры могут использоваться только клиентами! – fjsj

1

Вы можете создать прокси-службу RESTful и использовать ее как точку входа во все ваши другие службы RESTful. Этот прокси-сервер может получать запросы, выполнять любую предварительную обработку, вызывать требуемую службу RESTful, обрабатывать ответ и затем возвращать что-то вызывающему.

У меня есть такая настройка в проекте, над которым я работал. Прокси выполняет такие функции, как проверка подлинности, авторизация и ведение журнала аудита. Если хочешь, я могу узнать подробности.

Редактировать:
Вот представление о том, как вы можете реализовать прокси-сервер, который поддерживает запросы GET;

@Path("/proxy") 
public class Proxy 
{ 
private Logger log = Logger.getLogger(Proxy.class); 

@Context private UriInfo uriInfo; 

@GET 
@Path("/{webService}/{method}") 
public Response doProxy(@Context HttpServletRequest req, 
       @PathParam("webService") String webService, 
       @PathParam("method") String method) 
{ 
    log.debug("log request details"); 

    //implement this method to work out the URL of your end service 
    String url = constructURL(req, uriInfo, webService, method); 

    //Do any actions here before calling the end service 

    Client client = Client.create(); 
    WebResource resource = client.resource(url); 

    try 
    { 
     ClientResponse response = resource.get(ClientResponse.class); 
     int status = response.getStatus(); 
     String responseData = response.getEntity(String.class); 

     log.debug("log response details"); 

     //Do any actions here after getting the response from the end service, 
     //but before you send the response back to the caller. 

     return Response.status(status).entity(responseData).build(); 
    } 
    catch (Throwable t) 
    { 
     //Global exception handler here 
     //remember to return a Response of some kind. 
    } 
} 
+0

Звучит как решение, но как вы «обработаете ответ»? Можете ли вы привести пример этого прокси-сервера RESTful? – yegor256