简体   繁体   English

找不到适合响应类型 [class org.springframework.http.ResponseEntity] 和内容类型 [application/octet-stream] 的 HttpMessageConverter

[英]No suitable HttpMessageConverter found for response type [class org.springframework.http.ResponseEntity] and content type [application/octet-stream]

I'm following this guide stream file to send file through spring but I receive this exception on client side:我正在按照此指南流文件通过 spring 发送文件,但我在客户端收到此异常:

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class org.springframework.http.ResponseEntity] and content type [application/octet-stream]
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:110)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:572)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:530)
    at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:237)
    at client.services.FileServicesImpl.getFile(FileServicesImpl.java:28)
    at client.wbcontroller.ControllerMatlab.Get(ControllerMatlab.java:24)
    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.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
    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.doGet(FrameworkServlet.java:858)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    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.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:219)
    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:668)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
    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)

The code is easy and only to test, then I have to write byte[] as file on file system.代码很简单,只能进行测试,然后我必须将byte[]写为文件系统上的文件。

@Override
    public void getFile(String serverIp, String toStorePath, String filePath) throws Exception{
        RestTemplate restTemplate = new RestTemplate();
        ResponseEntity<byte[]> responseEntity  = restTemplate.getForObject(serverIp + "ATS/client/file/?filePath={filePath}", ResponseEntity.class, filePath);

        System.out.println("OK");

    }

I think there is a problem with the getForObject , like as the server want to send the stream but the client can't retrieve it.我认为getForObject存在问题,就像服务器想要发送流但客户端无法检索它一样。 On the server I have the same code of the guide:在服务器上,我有相同的指南代码:

@Override
    @RequestMapping(value = "/file", method = RequestMethod.GET) 
    public @ResponseBody ResponseEntity<byte[]> getAcquisition(HttpServletResponse resp,@RequestParam(value="filePath", required = true) String filePath){

        final HttpHeaders headers = new HttpHeaders();

        File toServeUp = new File(filePath);

        InputStream inputStream = null;

        try {
            inputStream = new FileInputStream(toServeUp);
        } catch (FileNotFoundException e) {
            //Also useful, this is a good was to serve down an error message
            String msg = "ERROR: Could not find the file specified.";
            headers.setContentType(MediaType.TEXT_PLAIN);
            return new ResponseEntity<byte[]>(msg.getBytes(), headers, HttpStatus.NOT_FOUND);
        }

        resp.setContentType("application/octet-stream"); //.exe file
        resp.setHeader("Content-Disposition", "attachment; filename=\"Test.zip\"");

        Long fileSize = toServeUp.length();
        resp.setContentLength(fileSize.intValue());
        OutputStream outputStream = null;

        try {
            outputStream = resp.getOutputStream();
        } catch (IOException e) {
            String msg = "ERROR: Could not generate output stream.";
            headers.setContentType(MediaType.TEXT_PLAIN);
            return new ResponseEntity<byte[]>(msg.getBytes(), headers, HttpStatus.NOT_FOUND);
        }

        byte[] buffer = new byte[1024];

        int read = 0;
        try {

            while ((read = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, read);
            }
        }
        catch (Exception e) {
            String msg = "ERROR: Could not read file.";
            headers.setContentType(MediaType.TEXT_PLAIN);
            return new ResponseEntity<byte[]>(msg.getBytes(), headers, HttpStatus.NOT_FOUND);
        }finally{
            //close the streams to prevent memory leaks
            try {
                inputStream.close();
                outputStream.flush();
                outputStream.close();           
            } catch (IOException e) {

            }

        }
        return null;    
    }

On the server receive exception about connection reset by peer (when outputStream has 16384 bytesWritten, so the while cycle is done some times).在服务器上收到有关对等方重置连接的异常(当 outputStream 有 16384 个字节写入时,因此 while 循环完成了几次)。 I would like to send any type of file.我想发送任何类型的文件。 Before that I stored the file in heap memory and send all the file, but it is a bad approach because with big file, or with simultaneous download, I received heap exception.在此之前,我将文件存储在堆内存中并发送所有文件,但这是一种不好的方法,因为对于大文件或同时下载,我收到了堆异常。 Do you have any idea?Thanks你有什么想法吗?谢谢

it seems work with row它似乎与行一起工作

ResponseEntity<byte[]> responseEntity  = restTemplate.getForEntity(serverIp + "ATS/client/file/?filePath={filePath}", byte[].class, filePath);

instead of代替

ResponseEntity<byte[]> responseEntity  = restTemplate.getForObject(serverIp + "ATS/client/file/?filePath={filePath}", ResponseEntity.class, filePath);

尝试控制您的安全配置可能是由错误的安全配置生成的 html 错误页面。

Set in the Json response the next header:在 Json 响应中设置下一个标头:

 "headers": { "Content-Type": "application/json" }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何声明由SpringFramework的org.springframework.http.ResponseEntity类设置的“ Content-Type”? - How to assert “Content-Type” set by SpringFramework's org.springframework.http.ResponseEntity class? 提取类型 [class org.springframework.http.ResponseEntity] 和内容类型 [text/html;charset=UTF-8] 的响应时出错; - Error while extracting response for type [class org.springframework.http.ResponseEntity] and content type [text/html;charset=UTF-8]; HTTPUrlConnection和应用程序/八位字节流内容类型响应处理 - HTTPUrlConnection and application/octet-stream content-type response handling 找不到适用于响应类型[..]和内容类型[application / json]的HttpMessageConverter - No suitable HttpMessageConverter found for response type [..] and content type [application/json] 找不到适合响应类型和内容类型的HttpMessageConverter - no suitable HttpMessageConverter found for response type and content type 找不到针对媒体类型=应用程序/八位字节流,类型=类org.glassfish.jersey.media.multipart.MultiPart的MessageBodyWriter - MessageBodyWriter not found for media type=application/octet-stream, type=class org.glassfish.jersey.media.multipart.MultiPart 没有找到适合响应类型的 HttpMessageConverter - no suitable HttpMessageConverter found for response type 无法提取响应:没有找到适合响应类型 class 和内容类型 [text/html] 的 HttpMessageConverter - Could not extract response: no suitable HttpMessageConverter found for response type class and content type [text/html] 如何将 RestTemplate 与 application/octet-stream 响应类型一起使用 - How to use RestTemplate with application/octet-stream response type 找不到媒体类型= application / octet-stream的MessageBodyReader - MessageBodyReader not found for media type=application/octet-stream
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM