out.write("")和response.getOutputStream()冲突

本文介绍了一种常见的Java Web开发中的异常:同时调用response.getOutputStream()和response.getWriter()导致的非法状态异常。解释了Servlet规范的相关规定,并给出了避免此异常的具体方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单解决java.lang.IllegalStateException: getOutputStream() has already been called for this response
 at org.apache.catalina.connector.Response.getWriter(Response.java:611)

 
out.clear(); 
out = pageContext.pushBody(); 

// 输出图象到页面 
ImageIO.write(image, "JPEG", response.getOutputStream()); 

产生这样的异常原因:是web容器生成的servlet代码中有out.write(""),这个和JSP中调用的response.getOutputStream()产生冲突.即Servlet规范说明,不能既调用response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出IllegalStateException,因为在jsp中,out变量实际上是通过response.getWriter得到的,你的程序中既用了response.getOutputStream,又用了out变量,故出现以上错误。
package com.example.kgqaapp.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.ServletOutputStream; import jakarta.servlet.http.HttpServletResponse; import okhttp3.*; import org.json.JSONArray; import org.json.JSONObject; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeUnit; @Controller @RequestMapping("/v1") public class OpenAIStream { // 1. 配置 MaxKB 接口地址 @Value("${old_maxkb_url}") private String url; // 2. 配置 MaxKB 的 API Key @Value("${maxkb_apikey}") private String apiKey; private final OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder() .connectTimeout(60, TimeUnit.SECONDS) .readTimeout(120, TimeUnit.SECONDS) .writeTimeout(60, TimeUnit.SECONDS) .build(); @PostMapping("/test") public void demo(@RequestBody String message, HttpServletResponse res) throws IOException { // 3. 设置响应头 res.setContentType("text/event-stream;charset=UTF-8"); res.setHeader("Cache-Control", "no-cache"); // 4. 构造请求体 MediaType mediaType = MediaType.parse("application/json"); JSONObject json = new JSONObject(); json.put("messages", new JSONArray(message)); json.put("stream", true); okhttp3.RequestBody body = okhttp3.RequestBody.create(mediaType, json.toString()); Request request = new Request.Builder() .url(url) // MaxKB 完整地址 .post(body) .addHeader("Content-Type", "application/json;charset=UTF-8") .addHeader("Authorization", "Bearer " + apiKey) // 或 "Api-Key: " + apiKey .build(); try (ServletOutputStream out = res.getOutputStream(); Response response = HTTP_CLIENT.newCall(request).execute()) { if (!response.isSuccessful()) { out.write(("event: error\ndata: MaxKB error " + response.code() + "\n\n").getBytes(StandardCharsets.UTF_8)); out.flush(); return; } // 5. 流式转发 try (InputStream in = response.body().byteStream()) { byte[] buffer = new byte[1024]; int len; while ((len = in.read(buffer)) != -1) { out.write(buffer, 0, len); out.flush(); } } } } }这里出问题了,请帮我看看
最新发布
07-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值