Внедрение пользовательского заголовка ответа в RESTEasy JAX-RS

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

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

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


person Ralph    schedule 25.03.2011    source источник


Ответы (4)


Я думаю, что использование 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-адресов, и все готово.

person Tarlog    schedule 25.03.2011

Хотя 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);
    }

}
person acdcjunior    schedule 13.03.2013
comment
или если вы просто хотите добавить/заменить заголовок независимо от существующего, вы можете использовать: response.getMetadata().putSingle(X-BuildTime, 20100335.1130); - person shonky linux user; 20.12.2013

Как насчет использования 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();
}
person user3580809    schedule 28.04.2014