Внедрение пользовательского заголовка ответа в RESTEasy JAX-RS - PullRequest
7 голосов
/ 25 марта 2011

У меня есть сервер RESTEasy (JAX-RS) с около 60 службами (пока).Я хотел бы автоматически вставлять настраиваемый заголовок ответа вызывающим абонентам провайдера со временем сборки сервера: X-BuildTime: 20100335.1130.

Есть ли простой способ сделать это без изменения каждой из моих служб?

Я пытаюсь использовать класс, который реализует org.jboss.resteasy.spi.interception.PostProcessInterceptor с аннотациями @Provider и @ServerInterceptor, но я не могу понять, как изменить ServerResponse, который передается в мой метод postProcess().

Ответы [ 4 ]

11 голосов
/ 13 марта 2013

Хотя MessageBodyWriterInterceptor помогает, лучше использовать PostProcessInterceptor, поскольку он будет перехватывать ответы, которые не вызывают MessageBodyWriters (например, Response.created(URI.create("/rest/justcreated")).build()).

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

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.Provider;

import org.jboss.resteasy.annotations.interception.ServerInterceptor;
import org.jboss.resteasy.core.ServerResponse;
import org.jboss.resteasy.spi.interception.PostProcessInterceptor;

@Provider
@ServerInterceptor
public class MyPostProcessInterceptor implements PostProcessInterceptor {

    @Override
    public void postProcess(ServerResponse response) {
        MultivaluedMap<String, Object> headers = response.getMetadata();
        List<Object> domains = headers.get("X-BuildTime");
        if (domains == null) { domains = new ArrayList<Object>(); }
        domains.add("20100335.1130");
        headers.put("X-BuildTime", domains);
    }

}
6 голосов
/ 25 марта 2011

Я думаю, что использование javax.servlet.Filter будет гораздо более простым решением:

public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException {
   HttpServletResponse httpResponse = (HttpServletResponse)response;
   httpResponse.setHeadder(header, headerValue);
   chain.doFilter(request, response);
}

настройте его в web.xml для соответствующих URL-адресов, и все готово.

2 голосов
/ 28 апреля 2014

Как насчет использования javax.ws.rs.core.Response; таким образом, вы можете установить заголовок в том же месте, где вы создаете данные ответа.

@GET
@Path("/test")
@Produces(MediaType.APPLICATION_JSON)
public Response test(           ){
    HashMap<String,String> ret = new HashMap<String,String>();
    ret.put("foo","bar");
    return Response
       .status(Response.Status.OK)
       .entity(ret)
       .header("X-say", "Hello world!")
       .build();
}
2 голосов
/ 06 июля 2012

Вы также можете изменить заголовок с помощью MessageBodyInterceptors

(см. Пример в конце раздела 30.1)

@Provider
@ServerInterceptor
public class MyHeaderDecorator implements MessageBodyWriterInterceptor {

    public void write(MessageBodyWriterContext context) throws IOException, WebApplicationException
    {
       context.getHeaders().add("My-Header", "custom");
       context.proceed();
    }
}
...