Java:在HTTP get请求中打印多余的行

时间:2013-12-05 18:05:24

标签: java http servlets get

当我通过浏览器调用以下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(),我只得到文件中的无关行,表明在返回后会出现“响应”。)

2 个答案:

答案 0 :(得分:1)

错误似乎是Produces annotation应该是:

@Produces(MediaType.TEXT_PLAIN)

这与额外的JSON数据一致。

(也许更好的“text / 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(;

答案 1 :(得分:1)

@Joop提出的答案并不适合我。所以,我正在回答,以防它也不适合你(但我的解决方案有点黑客)。实际发生的是它正在打印代理请求对象的toString()。以下是解决至少我的问题的代码/ hack: -

@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 *""*;
}