spring boot multipartFile mit application/octet-stream wirft exception

Wollte ich bauen eine einfache Rest-api mit Spring boot, die akzeptiert jede gegebene Datei und führt dann einige Aktionen auf Sie . Ich ging durch die Feder-Beispiele auf multipartFile https://spring.io/guides/gs/uploading-files/ und ich beschlossen, den gleichen Ansatz Folgen. Die Dateien, die hochgeladen wird, durch meine rest-api haben einige spezifische Erweiterung. Also gab ich den content-type wie application/octet-stream . Wenn ich versuche zu laufen, meine unit-test-Fällen für die gleichen,
Ich bekomme immer die Ausnahme von

nested exception is org.springframework.web.multipart.MultipartException: The current request is not a multipart request

Diese Ausnahme wird nicht angezeigt, wenn der content-type ist text/plain, oder wenn es nicht 'verbraucht' - parameter in der requestMapping.

Mein controller code sieht wie folgt aus :

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

@Controller
@RequestMapping("/v1/sample")
public class SampleController {

    private static Logger log = LoggerFactory.getLogger(SampleController.class);

    @RequestMapping(path = "/{id}/upload",
                    consumes = {MediaType.APPLICATION_OCTET_STREAM_VALUE},
                    method = RequestMethod.POST)
    public ResponseEntity<String> uploadfile(@PathVariable String id,
            @RequestParam("file") MultipartFile upgradeFile) {
        log.info("Obtained a upload request for the id {}",id );
        return new ResponseEntity<String>("file upload has been accepted.",
                HttpStatus.ACCEPTED);
    }

}

Und mein unit-test-Code ist wie folgt :

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.fileUpload;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.webAppContextSetup;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import com.stellapps.devicemanager.fota.Application;

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@SpringApplicationConfiguration(classes = Application.class)
@EnableWebMvc
public class ControllerTest {

    @Autowired
    private WebApplicationContext webApplicationContext;

    private MockMvc mockMvc;

    @Before
    public void mockMvcBuilder() {
        this.mockMvc = webAppContextSetup(webApplicationContext).build();
    }

    @Test
        public void test_ValidPayload() {
            String uri = "/v1/sample/1234/upload";
            Path path = Paths.get("src/test/resources/someFile");
            try {
                byte[] bytes = Files.readAllBytes(path);
                 MockMultipartFile multipartFile =
                            new MockMultipartFile("file", "someFile.diff", "application/octet-stream", bytes);
                 mockMvc.perform(fileUpload(uri).file(multipartFile).contentType(MediaType.APPLICATION_OCTET_STREAM_VALUE))
                    .andExpect(status().isAccepted());
            } catch (IOException e1) {
                //TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (Exception e) {
                //TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
}

Wenn ich text/plain content-type, und ich gebe eine normale text-Datei, geht es gut durch. Wenn ich den content-type wie application/octet-stream wirft es die folgende Ausnahme

    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.springframework.web.multipart.MultipartException: The current request is not a multipart request
    at org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver.assertIsMultipartRequest(RequestPartMethodArgumentResolver.java:204)
    at org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver.resolveArgument(RequestPartMethodArgumentResolver.java:129)
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:99)
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:817)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:731)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968)

Wie Mache ich meine Anfrage akzeptieren application/octet-stream und welche änderungen sollte ich machen, um den test-Fall sicherzustellen, dass es gelingt.

UPDATE:

Entfernen der verbraucht header und nicht die Angabe des content-type-in MockPartFile ist eine Möglichkeit, eine Datei hochzuladen. Ich nehme an, standardmäßig der controller nimmt es als application/octet-stream

UPDATE:

Danke für die Antwort. Ich war mit einer früheren version von spring (1.3.1) und nach Durchlaufen die Antwort, ich aktualisiert mein spring-version und die test-Fall-zu-match, und es begann zu arbeiten.

Bitte geben Sie eine minimale reproduzierbare Beispiel. Wie war dein MockMvc einrichten? Was macht Ihr multipart-Konfiguration Aussehen?
Auch, warum erwartest du einen bad request? Einige Dinge, die hier nicht Auschecken, editieren Sie bitte Ihre Frage mit den geforderten details.

InformationsquelleAutor Raveesh Sharma | 2016-10-26

Schreibe einen Kommentar