java.lang.IllegalStateException: Cannot call sendError() after the response has

简介:

异常出现的场景:

(1)ssh项目,提供下载功能。项目使用tomcat部署;

(2)写了一个测试类来测试下载功能,执行时报异常:

Java.lang.IllegalStateException: Cannot call sendError() after the response has been committed

 

下载类在struts中的配置(截取):

Xml代码   收藏代码
  1. <action name="downloadOneFile" class="downloadOneFileAction">  
  2.             <result type="stream" name="success">  
  3.                 <param name="inputName">downloadFile</param>  
  4.                 <param name="contentType"></param>  
  5.                 <param name="contentDisposition">attachment;filename=${filename}</param>  
  6.                 <param name="bufferSize">4096</param>  
  7.             </result>  
  8.         </action>  

在测试代码中使用 HttpURLConnection模拟浏览器发送http请求,读取应答体的部分代码如下:



上述代码是有问题的,本来bis中有1k的字节,结果我试图读取2k的字节,所以就报错了,原因找到了,怎么解决呢?

修改为:

Java代码   收藏代码
  1. private static byte[] readDataFromLength2(HttpURLConnection huc,  
  2.             int contentLength) throws Exception {  
  3.   
  4.         InputStream in = huc.getInputStream();  
  5.         BufferedInputStream bis = new BufferedInputStream(in);  
  6.   
  7.         // 数据字节数组  
  8.         byte[] receData = new byte[contentLength];  
  9.         int readLength = 0;  
  10.         // 数据数组偏移量  
  11.         int offset = 0;  
  12.   
  13.         readLength = bis.read(receData, offset, contentLength);  
  14.         // 已读取的长度  
  15.         int readAlreadyLength = readLength;  
  16.         while (readAlreadyLength < contentLength) {  
  17.             readLength = bis.read(receData, readAlreadyLength, contentLength  
  18.                     - readAlreadyLength);  
  19.             readAlreadyLength = readAlreadyLength + readLength;  
  20.         }  
  21.       
  22.         return receData;  
  23.     }  

 解决问题的过程:

1刚开始以为是编码的问题,怀疑BufferedInputStream bis = new

BufferedInputStream(in);BufferedInputStream的构造方法的第二个参数是编码(如GBK,UTF-8等),结果证明没有这个参数;

2bis.read的第三个参数刚开始以为是索引,结果发现是长度(读取的字节);

3while中比较时,应该是readAlreadyLengthcontentLength进行比较。 

参阅附件中com.http.util.HttpSocketUtil  .附件中的项目是使用maven 构建的。

注意读取BufferedInputStream时 使用while循环是必要的。

相关文章
|
3月前
|
Java 数据库连接 mybatis
成功解决:java.lang.Integer cannot be cast to java.lang.Long
这篇文章讨论了Java中常见的类型转换错误,包括Integer转Long、Integer转String以及在MyBatis中Map接收查询结果时的类型不匹配问题,并提供了相应的解决方法。
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
81 5
|
2月前
|
Oracle Java 关系型数据库
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
如果遇到"exec format error"问题,文章建议先检查Linux操作系统是32位还是64位,并确保安装了与系统匹配的JDK版本。如果系统是64位的,但出现了错误,可能是因为下载了错误的JDK版本。文章提供了一个链接,指向Oracle官网上的JDK 17 Linux版本下载页面,并附有截图说明。
Linux下JDK环境的配置及 bash: /usr/local/java/bin/java: cannot execute binary file: exec format error问题的解决
|
3月前
|
Java 开发工具
开发工具系类 之 Cannot determine path to ‘tools.jar‘ library for 17 (D:/Program Files/Java/jdk-17.0.9)
这篇文章讲述了作者在升级JDK至17版本后遇到IDEA无法识别`tools.jar`的问题,并提供了两种解决方法:升级IDEA版本或降低JDK版本,并提供了相关版本的IDEA兼容性信息。
开发工具系类 之 Cannot determine path to ‘tools.jar‘ library for 17 (D:/Program Files/Java/jdk-17.0.9)
|
3月前
|
前端开发 Java
成功解决:java.lang.String cannot be cast to java.lang.Integer
这篇文章记录了作者在使用Axios二次封装时遇到的一个Java类型转换问题,即前端传递的字符串参数不能直接转换为Integer类型,文章提供了正确的转换方法来解决这个问题。
成功解决:java.lang.String cannot be cast to java.lang.Integer
|
3月前
|
JSON 前端开发 fastjson
成功解决:java.util.LinkedHashMap cannot be cast to com.zyz.bookshopmanage.pojo.GoodsInfo
这篇文章讲述了在Java后端开发中遇到的类型转换错误,即无法将`java.util.LinkedHashMap`转换为`com.zyz.bookshopmanage.pojo.GoodsInfo`对象的问题。文章提供了解决这个问题的两种方法:一是将对象转换为JSON字符串再反序列化为对象,二是通过在项目的pom文件中引入fastjson库来简化转换过程。最后,文章展示了成功转换对象的代码示例。
成功解决:java.util.LinkedHashMap cannot be cast to com.zyz.bookshopmanage.pojo.GoodsInfo
|
3月前
|
JSON 前端开发 JavaScript
JSON parse error: Cannot deserialize value of type `java.lang.Integer` from Boolean value
这篇文章讨论了前端Vue应用向后端Spring Boot服务传输数据时发生的类型不匹配问题,即后端期望接收的字段类型为`int`,而前端实际传输的类型为`Boolean`,导致无法反序列化的问题,并提供了问题的诊断和解决方案。
JSON parse error: Cannot deserialize value of type `java.lang.Integer` from Boolean value
|
3月前
|
Android开发
Cannot create android app from an archive...containing both DEX and Java-bytecode content
Cannot create android app from an archive...containing both DEX and Java-bytecode content
35 2
|
4月前
|
Java
关于idea报错:Cannot determine path to 'tools.jar' library for 17 (E:\java-jdk\jdk17)的解决办法
关于idea报错:Cannot determine path to 'tools.jar' library for 17 (E:\java-jdk\jdk17)的解决办法
|
3月前
|
开发工具 数据安全/隐私保护
【Azure Developer】使用MSAL4J 与 ADAL4J 的SDK时候,遇见了类型冲突问题 "java.util.Collections$SingletonList cannot be cast to java.lang.String"
【Azure Developer】使用MSAL4J 与 ADAL4J 的SDK时候,遇见了类型冲突问题 "java.util.Collections$SingletonList cannot be cast to java.lang.String"
下一篇
无影云桌面