2011-03-25 204 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(); 
}