Java SpringMVC—在多部分请求中将XML参数编组到对象(JAXB)

Java SpringMVC—在多部分请求中将XML参数编组到对象(JAXB),java,spring,rest,spring-mvc,multipartform-data,Java,Spring,Rest,Spring Mvc,Multipartform Data,我使用SpringMVC和ApacheCommons多部分解析器支持创建了一个文件上载服务,该服务指定一个文件应该作为多部分HTTPPOST请求的一部分附加。该请求还包含一个参数,该参数包含一个XML字符串,其中包含有关该对象的元数据。XML可以使用JAXB进行编组 非多部分的其他服务透明地处理编组,例如: @RequestMapping(value = "/register", method = RequestMethod.POST) @ResponseStatus(HttpStatu

我使用SpringMVC和ApacheCommons多部分解析器支持创建了一个文件上载服务,该服务指定一个文件应该作为多部分HTTPPOST请求的一部分附加。该请求还包含一个参数,该参数包含一个XML字符串,其中包含有关该对象的元数据。XML可以使用JAXB进行编组

非多部分的其他服务透明地处理编组,例如:

@RequestMapping(value = "/register", method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    public ModelAndView createUser(@RequestBody CreateUserDTO createUserDTO) throws Exception {
        UserDTO user = userService.createUser(createUserDTO);
        return createModelAndView(user);
    }
这里CreateUserDTO是一个JAXB注释的对象,它被自动编组。 在多部分的情况下,我希望有相同的透明度。理想情况下,我想做以下工作:

RequestMapping(method = RequestMethod.POST)
    @ResponseStatus(HttpStatus.CREATED)
    public ModelAndView createAttachment(@RequestParam AttachmentDTO attachment,
                                         HttpServletRequest request) throws Exception {

        final MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        AttachmentDTO attachment = null;
        final MultipartFile dataFile = multipartRequest.getFile("data");

        AttachmentDTO createdAttachment = attachmentService.createAttachment(attachment,
                dataFile);

        return createModelAndView(createdAttachment);
}
不幸的是,这不起作用。我可以将附件参数绑定为字符串,但自动编组不起作用。我的工作是手动执行如下编组,但我不喜欢这种方法(特别是因为参数可能以JSON和XML形式指定):

有没有人对解决这个问题有更好的建议

为完整起见,我还在此处指定了相关的Spring配置:

<bean id="viewResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1"/>
        <property name="favorPathExtension" value="true"/>
        <property name="ignoreAcceptHeader" value="false"/>
        <property name="mediaTypes">
            <map>
                <entry key="xml" value="application/xml"/>
                <entry key="json" value="application/json"/>
            </map>
        </property>
        <property name="viewResolvers">
            <list>
                <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <property name="prefix" value="/WEB-INF/jsp/"/>
                    <property name="suffix" value=".jsp"/>
                </bean>
            </list>
        </property>
        <property name="defaultViews">
            <list>
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                    <property name="modelKey" value="object"/>
                    <property name="marshaller" ref="jaxbMarshaller"/>
                </bean>
                <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                    <property name="objectMapper" ref="jaxbJacksonObjectMapper"/>
                </bean>
            </list>
        </property>
    </bean>

    <!--Use JAXB OXM marshaller to marshall/unmarshall following class-->
    <bean id="jaxbMarshaller"
          class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="contextPath" value="com.behindmedia.btfd.model.dto"/>
    </bean>

    <bean id="jaxbJacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"/>

    <!-- allows for integration of file upload functionality -->
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
        <property name="maxUploadSize" value="100000000"/>
    </bean>

如此复杂的控制器,我对xml使用了xstream,但假设@RequestParam(“file”)MultipartFile文件就足够了为什么要使用HttpServletRequest!是否也在jsp中使用enctype=“multipart/form数据?
<bean id="viewResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1"/>
        <property name="favorPathExtension" value="true"/>
        <property name="ignoreAcceptHeader" value="false"/>
        <property name="mediaTypes">
            <map>
                <entry key="xml" value="application/xml"/>
                <entry key="json" value="application/json"/>
            </map>
        </property>
        <property name="viewResolvers">
            <list>
                <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
                <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                    <property name="prefix" value="/WEB-INF/jsp/"/>
                    <property name="suffix" value=".jsp"/>
                </bean>
            </list>
        </property>
        <property name="defaultViews">
            <list>
                <bean class="org.springframework.web.servlet.view.xml.MarshallingView">
                    <property name="modelKey" value="object"/>
                    <property name="marshaller" ref="jaxbMarshaller"/>
                </bean>
                <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
                    <property name="objectMapper" ref="jaxbJacksonObjectMapper"/>
                </bean>
            </list>
        </property>
    </bean>

    <!--Use JAXB OXM marshaller to marshall/unmarshall following class-->
    <bean id="jaxbMarshaller"
          class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="contextPath" value="com.behindmedia.btfd.model.dto"/>
    </bean>

    <bean id="jaxbJacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper"/>

    <!-- allows for integration of file upload functionality -->
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
        <property name="maxUploadSize" value="100000000"/>
    </bean>