2011-03-25 9 views
7

Tengo el servidor RESTEasy (JAX-RS) con aproximadamente 60 servicios (hasta ahora). Me gustaría insertar automáticamente un encabezado de respuesta personalizado para las personas que llamen al proveedor con el tiempo de compilación del servidor: X-BuildTime: 20100335.1130.Inyectar un encabezado de respuesta personalizada en RESTEasy JAX-RS

¿Hay una manera fácil de hacer esto sin modificar cada uno de mis servicios?

estoy tratando de utilizar una clase que implementa org.jboss.resteasy.spi.interception.PostProcessInterceptor con anotaciones @Provider y @ServerInterceptor, pero no puedo encontrar la manera de modificar el ServerResponse que se pasa a mi método postProcess().

Respuesta

5

creo usando javax.servlet.Filter será una solución mucho más fácil:

public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletResponse httpResponse = (HttpServletResponse)response; 
    httpResponse.setHeadder(header, headerValue); 
    chain.doFilter(request, response); 
} 

configurarlo en web.xml de las direcciones URL pertinentes, y ya está.

2

También puede cambiar encabezado por MessageBodyInterceptors

(comprobar el ejemplo al final de la sección 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

Aunque MessageBodyWriterInterceptor hace el truco, es mejor utilizar PostProcessInterceptor, ya que interceptará respuestas que no llaman MessageBodyWriters (como Response.created(URI.create("/rest/justcreated")).build()).

Para obtener más información, consulte el documentation oficial.

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

o si simplemente quiere añadir/reemplazar el encabezado existente, independientemente de que podría utilizar:. response.getMetadata() putSingle ("X-BUILDTIME", "20.100.335,1130"); –

1

Cómo sobre el uso javax.ws.rs.core.Response; De esta forma, puede configurar el encabezado en el mismo lugar donde crea los datos de respuesta.

@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(); 
} 
Cuestiones relacionadas