在RESTEasy中注入自定义响应标头JAX-RS
问题描述:
我有RESTEasy(JAX-RS)服务器,有大约60个服务(到目前为止)。我想用服务器编译时间自动将自定义响应头注入提供者调用者:X-BuildTime: 20100335.1130
。在RESTEasy中注入自定义响应标头JAX-RS
有没有简单的方法来做到这一点,而无需修改我的每一项服务?
我试图使用实现org.jboss.resteasy.spi.interception.PostProcessInterceptor
与注释@Provider
和@ServerInterceptor
一类,但我无法弄清楚如何修改传递到我postProcess()
方法ServerResponse。
答
我想用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中的相关网址,就大功告成了。
答
改变头部(检查在段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();
}
}
答
虽然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);
}
}
答
如何使用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();
}
或者如果你只是想添加/替换头不顾现有可以使用的: response.getMetadata()putSingle( “X-联编”, “20100335.1130”); – 2013-12-20 02:50:03