在RESTEasy JAX-RS中注入自定义响应头

时间:2011-03-25 15:33:56

标签: web-services http-headers jax-rs response resteasy

我有RESTEasy(JAX-RS)服务器,大约有60个服务(到目前为止)。我想使用服务器构建时间自动为提供者调用者注入自定义响应头:X-BuildTime: 20100335.1130

有没有一种简单的方法可以在不修改我的每项服务的情况下执行此操作?

我正在尝试使用带有注释org.jboss.resteasy.spi.interception.PostProcessInterceptor@Provider的{​​{1}}实现的类,但我无法弄清楚如何修改传递给{{1}的ServerResponse 1}}方法。

4 个答案:

答案 0 :(得分:11)

虽然MessageBodyWriterInterceptor可以解决问题,但最好使用PostProcessInterceptor,因为它会拦截不调用MessageBodyWriters的响应(例如Response.created(URI.create("/rest/justcreated")).build())。

有关详细信息,请参阅官方documentation

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);
    }

}

答案 1 :(得分:6)

我认为使用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中为相关网址配置它,您就完成了。

答案 2 :(得分:2)

您还可以按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();
    }
}

答案 3 :(得分:2)

如何使用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();
}