【问题标题】:How to manipulate the Content-Type request header before hitting the Controller component in Spring Boot?如何在 Spring Boot 中点击 Controller 组件之前操作 Content-Type 请求标头?
【发布时间】: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


    【解决方案1】:

    在 api 级别,在 @GetMapping 注解中,您可以在 consumes 参数中提供 MediaType。 媒体类型基本上是告诉 api 期望什么样的数据 - json、xml、pdf 等。您可以从here获得有关媒体类型的详细信息

    【讨论】:

    • Abhinav - 这与消耗参数无关。我的控制器接受多部分/表单数据。这里的问题是客户端需要将标头与边界值一起传递,例如 multipart/form-data;边界=.....不幸的是,消费者正在使用没有边界值的 API
    猜你喜欢
    • 2018-06-21
    • 2014-05-23
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2012-05-27
    相关资源
    最近更新 更多