IOException:已建立的连接被主机中的软件中止

Posted

技术标签:

【中文标题】IOException:已建立的连接被主机中的软件中止【英文标题】:ERR_INVALID_CHUNKED_ENCODING 200 machine 【发布时间】:2022-01-15 17:45:30 【问题描述】:

我想使用带有 ajax 的 Spring Boot 从数据库中获取数据,但出现错误 500。我检查了所有代码,但找不到服务器出错的原因。我可以在workbench 中检查下面的 sql 查询,它得到了完美的输出,但是 spring boot 触发错误。

Chrome 控制台:

GET http://localhost:8099/wholikepost?pstId=25 net::ERR_INVALID_CHUNKED_ENCODING 200

下面是我的代码:

存储库和服务


// Repository
public interface PostLikeRepo extends JpaRepository<LikePost, Integer>
    @Query(nativeQuery = true, value = "SELECT * FROM like_master WHERE post_id = ?")
    public List<LikePost> getTotalLikePopup(Integer id);


// Service
public class SomeServiceImpl implements SomeService

    @Autowired
    private PostLikeRepo PostLikeRepo;

    public List<LikePost> getTotalLikePopup(Integer Id)
       return this.PostLikeRepo.getTotalLikePopup(Id);
    

控制器

@RequestMapping(value = "/wholikepost", method = RequestMethod.GET)
@ResponseBody
public List<LikePost> getTotalLikePopup(HttpServletRequest req)

    List<LikePost> getWhoLikePost = this.SomeService.getTotalLikePopup(Integer.parseInt(req.getParameter("pstId")));
    return getWhoLikePost;

Ajax 请求

$(".like-style").on('click', function()
   let postId = parseInt($(this).attr("id").split("le")[1]); // get post id perfect
   $.ajax(
        type: "GET",
        url: "/wholikepost",
        data: pstId: postId ,
        success: function(res) 
            console.log(res);
        
    );
);

堆栈跟踪

Caused by: java.io.IOException: An established connection was aborted by the software in your host machine
    at java.base/sun.nio.ch.SocketDispatcher.write0(Native Method) ~[na:na]
    at java.base/sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:54) ~[na:na]
    at java.base/sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:113) ~[na:na]
    at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:79) ~[na:na]
    at java.base/sun.nio.ch.IOUtil.write(IOUtil.java:50) ~[na:na]
    at java.base/sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:532) ~[na:na]
    at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:135) ~[tomcat-embed-core-9.0.50.jar:9.0.50]
    at org.apache.tomcat.util.net.NioEndpoint$NiosocketWrapper.doWrite(NioEndpoint.java:1364) ~[tomcat-embed-core-9.0.50.jar:9.0.50]
    at org.apache.tomcat.util.net.SocketWrapperBase.doWrite(SocketWrapperBase.java:766) ~[tomcat-embed-core-9.0.50.jar:9.0.50]
    at org.apache.tomcat.util.net.SocketWrapperBase.writeBlocking(SocketWrapperBase.java:586) ~[tomcat-embed-core-9.0.50.jar:9.0.50]
    at org.apache.tomcat.util.net.SocketWrapperBase.write(SocketWrapperBase.java:530) ~[tomcat-embed-core-9.0.50.jar:9.0.50]
    at org.apache.coyote.http11.Http11OutputBuffer$SocketOutputBuffer.doWrite(Http11OutputBuffer.java:547) ~[tomcat-embed-core-9.0.50.jar:9.0.50]
    at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:112) ~[tomcat-embed-core-9.0.50.jar:9.0.50]
    at org.apache.coyote.http11.Http11OutputBuffer.doWrite(Http11OutputBuffer.java:194) ~[tomcat-embed-core-9.0.50.jar:9.0.50]
    at org.apache.coyote.Response.doWrite(Response.java:615) ~[tomcat-embed-core-9.0.50.jar:9.0.50]
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:340) ~[tomcat-embed-core-9.0.50.jar:9.0.50]
    ... 67 common frames omitted

【问题讨论】:

【参考方案1】:

99% 的几率您会受到以下问题的影响

您的 LikePost 实体通过 @ManyToMany@OneToMany 注释具有循环依赖关系,因此在转换为 JSON 响应时,它会面临堆栈溢出错误,然后隐藏在与客户端的关闭连接后面。

已经有类似事件here

检查您是否可以在您的某些@ManyToMany@OneToMany 中添加@JsonIgnore,以及这是否可以消除错误。那么您就可以 100% 确定这是原因所在。

【讨论】:

以上是关于IOException:已建立的连接被主机中的软件中止的主要内容,如果未能解决你的问题,请参考以下文章

Caused by: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。

java.io.IOException: 您的主机中的软件中止了一个已建立的连接

org.apache.catalina.connector.ClientAbortException: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。

解决Java使用response下载文件报错,并总结可能出错的原因: java.io.IOException: 你的主机中的软件中止了一个已建立的连接。

java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 (踩坑经历)

ClientAbortException: java.io.IOException: 您的主机中的软件中止了一个已建立的连接。,进不了Debug,访问不到方法