Spring MVC多部分响应

Asa*_*ger 5 spring response spring-mvc multipart

我正在尝试编写完整的多部分流,从客户端使用Spring restTemplate发送多部分请求,并从服务器端自动解析对象的不同部分(我使用JAXB进行对象编组)并在multipart中发回响应.

我能够实现几乎所有流程但我无法使用spring控制器的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;
}
Run Code Online (Sandbox Code Playgroud)

这是我在服务器端获得的例外:

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)
Run Code Online (Sandbox Code Playgroud)

看起来Spring试图将响应中的每个部分转换为String而不是正确的内容类型(file/xml etc /)我试图更新我的spring.xml文件,如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

尝试让他使用FormHttpMessageConverter正确编写部件,但这没有帮助

是否有任何方法使spring能够正确地使用不同类型的部件发送多部分响应?

Che*_*ole 2

您需要将响应的 Content-Type 标头设置为适当的值。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;
}
Run Code Online (Sandbox Code Playgroud)