【发布时间】:2022-07-15 06:11:10
【问题描述】:
我们最近将在 python 上运行的 RESTful API 迁移到 Java,Spring Boot。它是一个GET 端点。迁移后,我们观察到在调用 API 时 Spring Boot 服务返回“Internal Server Error”,并将 Content-Type 请求标头设置为 multipart/form-data。
但是,基于 Python 的实现可以正常工作,没有任何问题。以下是异常跟踪的摘录:
org.apache.tomcat.util.http.fileupload.FileUploadException: the request was rejected because no multipart boundary was found
at org.apache.tomcat.util.http.fileupload.impl.FileItemIteratorImpl.init(FileItemIteratorImpl.java:189)
at org.apache.tomcat.util.http.fileupload.impl.FileItemIteratorImpl.getMultiPartStream(FileItemIteratorImpl.java:205)
at org.apache.tomcat.util.http.fileupload.impl.FileItemIteratorImpl.findNextItem(FileItemIteratorImpl.java:224)
at org.apache.tomcat.util.http.fileupload.impl.FileItemIteratorImpl.<init>(FileItemIteratorImpl.java:142)
at org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:252)
at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:276)
at org.apache.catalina.connector.Request.parseParts(Request.java:2921)
at org.apache.catalina.connector.Request.getParts(Request.java:2823)
at org.apache.catalina.connector.RequestFacade.getParts(RequestFacade.java:1098)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:95)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:88)
at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:122)
at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1205)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
我从网上了解到,我们需要添加类似multipart/form-data; boundary=... 的边界标记。我们希望保留他们使用 Python 所拥有的 API 使用者的行为。话虽如此,有没有人可以在控件到达@Controller 层之前操纵请求标头?
目前,“内部服务器错误”是由 spring 框架本身引发的,并且控制直到@Controller 层才返回。
有没有办法控制 Spring 的行为?我们使用的是 Spring 2.5.6 版。
【问题讨论】:
标签: java spring spring-boot rest