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