Reputation: 179
I am trying to call a rest controller using get call which reads files from file system and return InputStream of that file.
client side code:
website = new URL(configurationFileUrl + "/stream/" + key.getReportRawDataId());
URLConnection connection = website.openConnection();
connection.setConnectTimeout(60 * 1000);
connection.setReadTimeout(60 * 1000);
stream = connection.getInputStream();
The controller code:
@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);
}
}
service:
@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);
}
while debugging I see the service is returning inputstream without any exception, but client side is throwing below IO exception:
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)
what is wrong I am doing here I tried setting
connection.setRequestProperty("accept", "application/octet-stream");
but no luck, could you please help
Upvotes: 1
Views: 6879
Reputation: 179
I have set the interceptor for the Rest Template code as below:
ClientHttpRequestInterceptor acceptHeaderPdf = getClientHttpRequestInterceptor(APPLICATION_STREAM);
<-- here APPLICTION_STREAM is my header externalized variable you can use your headers like application/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);
}
}
Upvotes: 0
Reputation: 21902
406 means your client isn't accepting the response it got from the server, so the server is unaware (ergo no error on the server).
It really depends on what the server is saying the data is.
Just telnet into your server:
telnet localhost:8091
and emit a:
GET /blueprintConfig/stream/1_check.png HTTP/1.1
(press return key twice)
Then look at the response headers to find out what your server is sending back to the client.
Alternatively, if you have curl
installed, just do:
curl -I http://localhost:8091/blueprintConfig/stream/1_check.png
And look at the headers.
Upvotes: 1