滤波器截止所有请求,并在响应中添加自定义标头。
当我实现containSponseFilter时,过滤器方法运行两次:
@Provider
public class MyCustomFilter implements ContainerResponseFilter throws IOException {
@Override
public void filter(ContainerRequestContext containerRequestContext,
ContainerResponseContext containerResponseContext) {
containerResponseContext.getHeaders().add("My-Key", "myvalue");
}
}
,并且向客户提供的响应确实包含标头。
我尝试过调试码头和泽西岛配置,并将问题范围缩小到以下旧控制器逻辑,我无法修改:
OutputStream out = response.getOutputStream();
PrintWriter printout = new PrintWriter(out);
JSONObject obj = new JSONObject(dummyData);
printout.print(obj);
似乎直接写入响应流触发了一些JAX-RS生命周期链,从而导致额外的处理阶段。
我在泽西岛2.52.1和码头9.4.4。
解决了它。
似乎访问outputStream并执行printwriter.print()触发了httpservletresponse"写入"状态,并开始返回对客户端的响应。
所以在我的控制器中:
@GET
@Path("/seatemperatures")
public HttpServletResponse modifyResponse(@Context HttpServletRequest request, @Context HttpServletResponse response) {
UtilClass.workOnResponse(request, response); //this uses printwriter.write()
return response;
}
我必须将返回类型更改为void:
@GET
@Path("/seatemperatures")
public void modifyResponse(@Context HttpServletRequest request, @Context HttpServletResponse response) {
UtilClass.workOnResponse(request, response);
}
从控制器返回响应对象似乎会导致内部500错误,并有效地尝试返回两个响应对象。