Java 在Springs HttpMessageConverter中处理流和异常

Java 在Springs HttpMessageConverter中处理流和异常,java,spring,Java,Spring,我制作了一个定制的spring HttpMessageConverter,以便从rest控制器创建和输出csv。 即,注册转换器以处理从控制器返回的类类型 我使用supercsv库/框架生成实际的csv,因此有一个CsvMapWriter,它使用writeInternal Overwrited方法中提供的HttpOutputMessage主体中的流: protected void writeInternal(MyType myObject, HttpOutputMessage outpu

我制作了一个定制的spring HttpMessageConverter,以便从rest控制器创建和输出csv。
即,注册转换器以处理从控制器返回的类类型

我使用supercsv库/框架生成实际的csv,因此有一个CsvMapWriter,它使用writeInternal Overwrited方法中提供的HttpOutputMessage主体中的流:

    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包装代码,作为处理流等资源时的“标准方法”

问题是,当抛出的异常在调用链中冒泡,并被spring错误处理机制(希望向客户端返回http状态500,指示服务器错误)拾取时,我会得到以下转储:

WARN 3208 --- [ qtp32193376-20] org.eclipse.jetty.server.HttpChannel     : Could not send response error 500
我假设这是因为我刚刚关闭了来自HttpOutputMessage的流,Spring现在想用它来写入错误状态等

这是有道理的,但我现在的问题是: 当抛出异常时,我是否应该关闭“finally”子句中的流?(只有当我知道所有处理都进行得很顺利时才关闭它)

也就是说,当Spring使用它进行错误处理时,我是否可以假设Spring在处理完资源释放后会处理它