Могу ли я обернуть все запросы JAX-RS пользовательским кодом предварительной отправки, последующей отправки и кода обработчика ошибок? - PullRequest
6 голосов
/ 12 октября 2010

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

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

Ответы [ 3 ]

2 голосов
/ 12 октября 2010

Вы также можете использовать 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 { 
           ... 
        } 
    }  

}  

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

1 голос
/ 12 октября 2010

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

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

Edit:
Вот идея о том, как вы можете реализовать прокси, поддерживающий запросы 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 голосов
/ 12 октября 2010

Вы можете использовать фильтры для чтения и изменения всех запросов и ответов.

...