当前位置: 首页 > 知识库问答 >
问题:

SpringMVC多部分响应

叶阳
2023-03-14

我试图编写完整的多部分流,从客户端使用Spring restTemplate发送多部分请求,从服务器端自动将不同部分解析为对象(我使用JAXB进行对象封送),并以多部分形式返回响应。

我能够实现几乎所有的流,但是我不能从spring Controller中用jaxb对象发送多部分响应。

@RequestMapping(value="/putuser",method=RequestMethod.POST)
@ResponseBody
public MultiValueMap<String, Object> getUser(@RequestBody User user) throws IOException, JAXBException {
    }
    user.setName("new");
    MultiValueMap<String, Object> form = new LinkedMultiValueMap<String, Object>();  
    form.add("user", user);
    form.add("file", new FileSystemResource("/tmp/1.1")); 
    return form;
}
java.lang.ClassCastException: org.springframework.core.io.FileSystemResource cannot be cast to java.lang.String
    at org.springframework.http.converter.FormHttpMessageConverter.writeForm(FormHttpMessageConverter.java:233)
    at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:197)
    at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:73)
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:148)
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:90)
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:189)
    at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:69)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:746)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:687)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:915)
<mvc:annotation-driven>
    <mvc:message-converters register-defaults="true">
       <bean class="org.springframework.http.converter.FormHttpMessageConverter">
                <property name="partConverters">
                    <list>
                        <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
                        <bean class="org.springframework.http.converter.StringHttpMessageConverter" />
                        <bean class="org.springframework.http.converter.ResourceHttpMessageConverter" />
                        <bean class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" />
                    </list>
                </property>
        </bean>
   </mvc:message-converters>
</mvc:annotation-driven>

试图使he FormHttpMessageConverter正确地编写部分,但这没有帮助

是否有任何方法使Spring发送不同类型的零件正确的多部分响应?

共有1个答案

巫化
2023-03-14

您需要将响应的Content-Type header设置为适当的值。FormHttpMessageConverter依赖于Content-Type来确定是否需要将响应强制转换为String或其他类型。

@RequestMapping(value="/putuser",method=RequestMethod.POST)
@ResponseBody
public MultiValueMap<String, Object> getUser(@RequestBody User user, HttpServletResponse httpResponse) throws IOException, JAXBException {
    }
    user.setName("new");
    MultiValueMap<String, Object> form = new LinkedMultiValueMap<String, Object>();  
    form.add("user", user);
    form.add("file", new FileSystemResource("/tmp/1.1")); 
    httpResponse.setContentType(MediaType.MULTIPART_FORM_DATA_VALUE); // <-- IMPORTANT
    return form;
}
 类似资料:
  • 通常,我需要通过JSOUP将数据以响应multipart/form-data的形式发送到站点 作为一个示例,使用一个简单的窗体来sgeniriruet您的查询。 <表单操作=«localhost:8000»方法=«post»enctype=»多部分/表单数据» <输入类型=»文本»名称=»文本»值=»文本默认值» <输入类型=»文件»名称=»文件1» <输入类型=»文件»名称=»文件2» 提交 通

  • 我有一个基于泽西的网络服务,它产生一个“多部分/混合”响应如下:该方法读取一个文件,并应以八位字节格式返回。此外,它读取该文件的元数据,并以json形式返回。 方法: 我的问题是,我得到了以下错误,这对我来说没有意义: 据我所知,是os。toByteArray()正在将我的对象转换为字节数组。 任何想法? 编辑:我正在使用Jersey 1.15

  • 我正在开发的API是在spring Boot中开发的。现在我有了一个API,我必须在其中发送响应,其中包含一个二进制文件和XML。两者将被多部分边界分开。那么有没有办法做到这一点呢?

  • 问题内容: 我有一个Java控制器,必须向我发送一些文本数据和不同的字节数组。因此,我正在构建n多部分请求,并将其写入到HttpServletResponse的流中。 现在我的问题是如何在客户端解析响应并提取多个部分。 服务器代码片段:- 客户代码片段:- 我检查了CloseableHttpResponse和HttpEntity,但是它们都不提供解析多部分请求的方法。 编辑1:这是我在客户端流中收

  • 我有一个java控制器,它必须向我发送一些文本数据和不同的字节数组。因此,我正在构建一个多部分请求,并将其从HttpServletResponse写入流。 现在我的问题是如何在客户端解析响应并提取多个部分。 服务器代码片段:- 客户端代码段:- 我检查了CloseableHttpResponse和HttpEntity,但它们都没有提供解析多部分请求的方法。 编辑1:这是我在客户端流中收到的示例响应

  • 在SpringMVC项目中,客户机发送一个带有序列化对象的请求,客户机本身是一个小程序,所以它不希望收到一个web页面作为响应,而是一个带有字符串对象的响应,该响应将告诉他这是成功还是失败。那么解决方案是什么呢?我想在@Controller中使用返回void的方法,或者返回不存在页面的方法?(在这两种情况下,我还想知道是否有回复给客户)