이미지를 InputStreamResource
으로 리턴하는 서블릿이 있습니다. 일부 get query
매개 변수를 기반으로 반환되는 약 50 개의 정지 이미지가 있습니다.RestController에서 InputStreamResource를 캐시하는 방법은 무엇입니까?
, 나는 그 이미지 응답을 캐시하고 싶습니다.
@RestController
public class MyRestController {
//code is just example; may be any number of parameters
@RequestMapping("/{code}")
@Cachable("code.cache")
public ResponseEntity<InputStreamResource> getCodeLogo(@PathVariable("code") String code) {
FileSystemResource file = new FileSystemResource("d:/images/" + code + ".jpg");
return ResponseEntity.ok()
.contentType("image/jpg")
.lastModified(file.lastModified())
.contentLength(file.contentLength())
.body(new InputStreamResource(file.getInputStream()));
}
}
다음과 같은 예외지고, I_'m을합니다 (RestMapping
방법에 경우 직접 상관없이 또는 외부 서비스에 리팩토링)을 @Cacheable
주석을 사용하여 :
cause: java.lang.IllegalStateException: InputStream has already been read - do not use InputStreamResource if a stream needs to be read multiple times - error: InputStream has already been read - do not use InputStreamResource if a stream needs to be read multiple times
org.springframework.core.io.InputStreamResource.getInputStream(InputStreamResource.java:96)
org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:100)
org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:47)
org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:195)
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:238)
org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:183)
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:832)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:743)
질문을 : 어떻게 그런 다음 InputStreamResource
유형의 ResponseEntity
을 캐시합니다.
한 번만 읽어야합니까? 또는 디스크의 파일을 변경 사항에 대해 모니터링해야합니까? – Niels
밤이나 매주와 같이 고정 된 기간에'@ EvictCache'를 호출하고 싶습니다. 따라서 일반적으로 한 번만 준비한 다음 파일을 로컬에서 검색하지 않고 다시 사용해야합니다. – membersound
지우기. 그렇지 않으면 컨트롤러 초기화 중에 한 번 파일을 읽고 ByteArrayResource에로드 할 수 있습니다. – Niels