2016-06-21 2 views
2

커스텀 Spring Web MessageConverter를 빌드하고 writeInternal 메소드를 오버라이드했습니다.커스텀 Spring Web MessageConverter에서 OutputStream을 플러시하거나 닫아야 할 필요가 있습니까?

getBody() OutputStream에서 flush를 호출해야합니까? 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-core/src/main/java/org/springframework/util/StreamUtils.java#L110

를 호출 https://github.com/spring-projects/spring-framework/blob/56db1af11dbe51c88c753421e022bc5389361c04/spring-web/src/main/java/org/springframework/http/converter/StringHttpMessageConverter.java#L107을 닫지 않습니다 ...

+0

이 관찰을 위해 하나 더하기. – PyThon

답변

1

어디서나() 메소드 가까운 호출하지 마십시오. 즉시 클라이언트 소켓을 분리하고 클라이언트 요청이 이미 처리로 자신의 서버에 아무 소용 실행 요청이 더있을 것 같은

당신은 close()를 메소드를 호출해서는 안됩니다. 또한 다양한 오류 조건을 초래할 수있는 구성된 모든 사후 필터 및 인터셉터 실행을 다듬습니다. 수동으로 호출에 대해 걱정해서는 안

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

응답 스트림

결국 요청 처리의 말에 용기 자체가 종료됩니다. 원하는대로 사용자 지정 변환기를 작성하십시오.

또한 콘텐츠를 버퍼링 된 출력 스트림으로 플러시 할 필요가 없으며 버퍼의 용량이 모두 소모되면 콘텐츠가 자동으로 플러시됩니다.

Gson 변환기가 실수로 응답하지 않을 수 있으며 json 데이터가 응답 스트림에 기록되는 즉시 요청이 종료됩니다. 당신은 이미 그것을 사용하는 결과를 알고 있습니다. 이게 실제로 문제가 될 경우 MappingJackson2HttpMessageConverter을 대안으로 생각할 수 있습니다. close에 json 문자열을 쓰면 출력 스트림이 생성되지 않습니다.

그러나 새 변환기를 작성하는 경우 코드의 아무 곳에서나 스트림을 닫지 않는 것이 좋습니다.

+0

데이터베이스 연결을 닫는 것을 잊지 않기를 바랍니다. 스트림을 닫지 않는 아이디어는 미친 짓입니다. 프레임 워크가 처리한다면, 그렇습니다. 하지만 열면 닫아주세요. –

+0

예 J2EEE – PyThon

+0

에 지정된대로 컨테이너 자체에서 자동으로 처리됩니다. 열기를 수행하지 않았습니다. 스프링이 –