7

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

有没有一种简单的方法可以在不修改我的每项服务的情况下做到这一点?

我正在尝试使用一个org.jboss.resteasy.spi.interception.PostProcessInterceptor通过注释@Provider和实现的类@ServerInterceptor,但我不知道如何修改传递给我的postProcess()方法的 ServerResponse。

4

4 回答 4

11

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

}
于 2013-03-13T03:56:24.687 回答
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 中为相关的 url 配置它,你就完成了。

于 2011-03-25T16:51:37.153 回答
4

使用 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();
}
于 2014-04-28T10:02:24.607 回答
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();
    }
}
于 2012-07-06T14:10:56.907 回答