处理Springs HttpMessageConverter

时间:2016-03-11 07:00:15

标签: java spring

我已经制作了一个自定义弹簧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会在资源释放完成后处理它吗?

0 个答案:

没有答案