我已经制作了一个自定义弹簧HttpMessageConverter,以便从静止控制器创建和输出csv。
即注册转换器以处理从控制器返回的类类型。
我使用supercsv库/框架来生成实际的csv,因此使用来自writeInternal覆盖方法中提供的HttpOutputMessage主体的流的CsvMapWriter:
protected void writeInternal(MyType myObject, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
OutputStreamWriter oswriter = new OutputStreamWriter(outputMessage.getBody());
ICsvMapWriter mapWriter = new CsvMapWriter(oswriter,CsvPreference.STANDARD_PREFERENCE);
然后我继续使用mapWriter将csv行直接写入流,例如
try{
mapWriter.writeHeader(transactionHeader);
mapWriter.write(transactionLevelMap, transactionHeader, getTransactionInfoProcessors());
} finally {
if (mapWriter != null) {
mapWriter.close();
}
}
由于写入 - 和csv映射处理 - 可以抛出异常,因此在处理像流这样的资源时,我用try-finally包装代码作为“标准方法”。
问题是,当抛出的异常通过调用链冒泡并且被弹簧错误处理机制拾取时 - 想要将http状态500返回给客户端,表明服务器错误,我得到以下转储:
WARN 3208 --- [ qtp32193376-20] org.eclipse.jetty.server.HttpChannel : Could not send response error 500
我认为这是因为我刚刚关闭了来自HttpOutputMessage的流,Spring现在想用它来编写错误状态等。
这是有道理的,但我现在的问题是: 当抛出异常时,我不应该关闭“finally”子句中的流吗? (并且只关闭它,当我现在所有处理都顺利的时候)
即。我可以假设,当它使用它进行错误处理时,Spring会在资源释放完成后处理它吗?