2011-03-25 118 views
7

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

有没有简单的方法来做到这一点,而无需修改我的每一项服务?

我试图使用实现org.jboss.resteasy.spi.interception.PostProcessInterceptor与注释@Provider@ServerInterceptor一类,但我无法弄清楚如何修改传递到我postProcess()方法ServerResponse。

回答

5

我想用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

也可以通过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(); 
    } 
} 
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

或者如果你只是想添加/替换头不顾现有可以使用的: response.getMetadata()putSingle( “X-联编”, “20100335.1130”); – 2013-12-20 02:50:03

1

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