2016-06-21 8 views
2

Я создал пользовательский Spring Message Message Convert и переопределил метод writeInternal.Нужно ли скрывать или закрывать OutputStream в моем пользовательском Spring Web MessageConverter

Должен ли я называть flush на getBody() OutputStream? Должен ли я закрыть getBody() OutputStream?

, похоже, существует несоответствие между различными преобразователями.

Я думал, не к обоим с весны хочет очистить выходной поток см https://github.com/spring-projects/spring-framework/blob/56db1af11dbe51c88c753421e022bc5389361c04/spring-web/src/main/java/org/springframework/http/converter/AbstractGenericHttpMessageConverter.java#L101

но потом я увидел, что на самом деле gson закрытия потока? это просто ошибка или желаемое поведение? https://github.com/spring-projects/spring-framework/blob/56db1af11dbe51c88c753421e022bc5389361c04/spring-web/src/main/java/org/springframework/http/converter/json/GsonHttpMessageConverter.java#L203

, а затем в StringConverter флеши, но не закрывает https://github.com/spring-projects/spring-framework/blob/56db1af11dbe51c88c753421e022bc5389361c04/spring-web/src/main/java/org/springframework/http/converter/StringHttpMessageConverter.java#L107, который вызывает https://github.com/spring-projects/spring-framework/blob/56db1af11dbe51c88c753421e022bc5389361c04/spring-core/src/main/java/org/springframework/util/StreamUtils.java#L110

так на самом деле не видя окончательного ответа в предшествующем уровне техники ...

+0

плюс один для этого наблюдения. – PyThon

ответ

1

Никогда не называйте близко() метод в любом месте.

Вы никогда не должны вызывать близко() метода, как он будет немедленно отсоединить разъем клиента и их будет запрос нет смысла выполнения в дальнейшем на сервере, как запрос клиента уже обработан. Также он будет обрезать все сконфигурированные пост-фильтры и выполнение перехватчиков, что может привести к различным ошибкам.

Why should we not call close method on response stream/writer?

поток Ответ будет в конечном счете закрыт самим контейнером в конце обработки запроса, так что вы не должны беспокоиться о вызове вручную. Просто напишите свой собственный конвертер, как вы этого хотите.

Также вам не нужно очищать содержимое как буферизованный выходной поток, содержимое автоматически очищается, когда буферы заканчиваются из емкости.

Конвертер Gson может ошибаться, и запрос все равно прекратится, как только данные json будут записаны в поток ответов. Как вы уже знаете последствия их использования. Если это действительно приведет к возникновению каких-либо проблем в вашем случае, тогда вы можете думать о MappingJackson2HttpMessageConverter как альтернативе, это не close поток вывода после записи в него строки json.

Но если вы пишете новый конвертер, тогда будет лучше не закрывать потоки в любом месте кода.

+0

Надеюсь, вы не забудете закрыть соединения с базой данных. Идея о том, что вы никогда не закрываете поток, сумасшедшая. Если структура позаботится об этом, тогда все в порядке. Но если вы откроете его, закройте его. –

+0

Да, это будет автоматически обрабатываться самим контейнером, как указано в J2EEE – PyThon

+0

хорошо..и не открыли его весна сделала –