2015-11-13 47 views
0

我想調用一個休息控制器,使用從文件系統讀取文件並返回該文件的InputStream的get調用。從其餘的API讀取InputStream獲取調用

客戶端代碼:

website = new URL(configurationFileUrl + "/stream/" + key.getReportRawDataId()); 
      URLConnection connection = website.openConnection(); 
      connection.setConnectTimeout(60 * 1000); 
      connection.setReadTimeout(60 * 1000); 
      stream = connection.getInputStream(); 

控制器代碼:

@RestController 
@RequestMapping(value = "/blueprintConfig", produces = {"application/octet-stream", "application/json"}, headers = "Accept=*/*") 
public class ReportConfigurationController { 

@ResponseBody 
    @RequestMapping(value = "/stream/{id:.+}", method = RequestMethod.GET) 
    public ResponseEntity<?> getFilesAsStream(@PathVariable("id") String id) throws Exception { 
     return configurationService.getFilesAsStream(id); 
    } 

} 

服務:

@Override 
    public ResponseEntity<?> getFilesAsStream(String id) throws Exception { 
     String filePath = resourcePath + id; 
     InputStream is = null; 
     try { 
      is = new FileInputStream(filePath); 
     } catch (FileNotFoundException e) { 
      LOGGER.error("can not read file: {}", e); 
     } 
     return new ResponseEntity<InputStream>(is, HttpStatus.OK); 
    } 

在調試時我看到的服務沒有任何異常返回的InputStream,但客戶端方拋出IO異常:

java.io.IOException: Server returned HTTP response code: 406 for URL: http://localhost:8091/blueprintConfig/stream/1_check.png 

at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1839) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440) 
    at com.jasper.wrapper.service.ReportServiceImpl.putInCache(ReportServiceImpl.java:128) 
    at com.jasper.wrapper.service.ReportServiceImpl.populateCache(ReportServiceImpl.java:110) 
    at com.jasper.wrapper.service.ReportServiceImpl.lambda$generateReport$0(ReportServiceImpl.java:64) 
    at com.jasper.wrapper.service.ReportServiceImpl$$Lambda$8/819977316.accept(Unknown Source) 
    at java.util.LinkedHashMap.forEach(LinkedHashMap.java:676) 
    at com.jasper.wrapper.service.ReportServiceImpl.generateReport(ReportServiceImpl.java:64) 
    at com.jasper.wrapper.controller.JasperReportController.generateReport(JasperReportController.java:27) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:775) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

什麼是錯的,我在這裏做什麼我已嘗試設置

connection.setRequestProperty("accept", "application/octet-stream"); 

,但沒有運氣,你能幫

回答

1

406意味着你的客戶端不接受從服務器得到的迴應,所以服務器不知道(在服務器上沒有錯誤)。

這實際上取決於服務器在說什麼數據。

只需遠程登錄到服務器:

telnet localhost:8091 

,併發出:

GET /blueprintConfig/stream/1_check.png HTTP/1.1 

(按回車鍵兩次)

再來看一下響應頭,找出你的服務器正在發回給客戶。

另外,如果你已經安裝了curl,只是做:

curl -I http://localhost:8091/blueprintConfig/stream/1_check.png 

,並期待在頭。

+0

它給出以下信息:HTTP/1.1 405不允許的方法 服務器:Apache-狼/ 1.1 允許:GET 內容類型:應用/ JSON;字符集= UTF-8 的Content-Length:239 日期:2015年11月13日星期五10:04:10 GMT – Krishna

0

我已經爲如下的休息模板代碼攔截器:

ClientHttpRequestInterceptor acceptHeaderPdf = getClientHttpRequestInterceptor(APPLICATION_STREAM);  

< - 在這裏APPLICTION_STREAM是我的頭外在變量,你可以用你的頭就像應用程序/ PDF格式... - >

restTemplate.setInterceptors(singletonList(acceptHeaderPdf)); 

private ClientHttpRequestInterceptor getClientHttpRequestInterceptor(String applicationJson) { 
     return new AcceptHeaderHttpRequestInterceptor(
       applicationJson); 
    } 

    class AcceptHeaderHttpRequestInterceptor implements ClientHttpRequestInterceptor { 
     private final String headerValue; 

     public AcceptHeaderHttpRequestInterceptor(String headerValue) { 
      this.headerValue = headerValue; 
     } 

     @Override 
     public ClientHttpResponse intercept(HttpRequest request, byte[] body, 
              ClientHttpRequestExecution execution) throws IOException { 

      HttpRequestWrapper requestWrapper = new HttpRequestWrapper(request); 
      requestWrapper.getHeaders().setAccept(singletonList(MediaType.valueOf(headerValue))); 

      return execution.execute(requestWrapper, body); 
     } 
    }