【问题标题】:Java: Extraneous line getting printed in HTTP get requestJava:在 HTTP 获取请求中打印了无关的行
【发布时间】:2013-12-22 19:57:25
【问题描述】:

当我从浏览器中调用以下 GET 方法时,我可以选择下载一个包含实际输出的文件和一个类似于

的无关行

输出

"Actual output string"

{"h":{"threadLocalInstance":{"threadLocalHashCode":505377872},"immutableThreadLocalInstance":{"threadLocalHashCode":1132005157}}}

代码

@Context
UriInfo info;
@Context
HttpServletRequest request;
@Context
HttpServletResponse response;

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("xyz")
public HttpServletResponse pqr() throws IOException {

    ABC abc = new ABC();
    abc.setOutputStream(response.getOutputStream());

    String fileName = abc.getFileName();
    //fileName = "results.csv"
    response.setContentType("text/csv");

    response.setHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");

    return response;
}

请求和响应对象是代理,包含与该无关行对应的对象。有人知道我怎样才能删除那条线吗? (如果我在“返回响应”之前执行 response.resetBuffer(),我会在文件中得到无关的行,这表明在返回后“响应”发生了一些事情。)

【问题讨论】:

  • 在解决此问题之前,您可以返回ServletResponseWrapper 修复所有问题。原因?过滤器?
  • @joop 你能详细说明一下吗?

标签: java http servlets get


【解决方案1】:

错误似乎应该是 Produces 注释:

@Produces(MediaType.TEXT_PLAIN)

这与额外的 JSON 数据一致。

(也许更好的“文本/cvs”?)

一个小问题:应在写入输出之前写入响应标头。由于在实践中使用响应缓冲,通常情况下相反(对于小数据,当没有缓冲区被写出时)。

ABC abc = new ABC();
String fileName = abc.getFileName();
//fileName = "results.csv"
response.setContentType("text/csv");
response.setHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");
abc.setOutputStream(response.getOutputStream());

对于测试,您可以这样做:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
abc.setOutputStream(baos);
byte[] data = baos.toByteArray();

// ... dump the bytes
OutputStream out = response.getOutputStream();
out.write(data);
out.flush(;

【讨论】:

  • 您建议的答案对我不起作用。所以,我为此创建了一个解决方法(并且会回答)
【解决方案2】:

@Joop 建议的答案对我不起作用。所以,如果它对你也不起作用,我会回答(但我的解决方案有点破解)。实际发生的是它正在打印代理请求对象的 toString()。以下是至少解决了我的问题的代码/黑客:-

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("xyz")
public *String* pqr() throws IOException {

    ABC abc = new ABC();
    abc.setOutputStream(response.getOutputStream());

    String fileName = abc.getFileName();
    //fileName = "results.csv"
    response.setContentType("text/csv");

    response.setHeader("Content-Disposition","attachment;filename=\"" + fileName + "\"");

    return *""*;
}

【讨论】:

  • 很好。所以实际上输出是通过 setOutputStream 和注解处理完成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多