首页 文章

当文件存在并被调试器看到时,Dropwizard FileNotFoundException

提问于
浏览
2

我正在测试使用dropwizard构建的 endpoints ,但出了点问题:

@Test
public void testPostWithFileSuccess() throws Exception
{
    FileDataBodyPart filePart = new FileDataBodyPart("file", new File(fixture("resources/testImage.jpg")));
    filePart.setContentDisposition(FormDataContentDisposition.name("file").fileName("testImage.jpg").build());

    FormDataMultiPart request = new FormDataMultiPart();
    request.field("data", fixture("resources/postWithFileSuccess.json"), MediaType.APPLICATION_JSON_TYPE);
    request.bodyPart(filePart);

    WebTarget target = mClient.target("http://localhost:8080/crackers").register(MultiPartFeature.class);
    Response response = target
            .request()
            .post(Entity.entity(request, MediaType.MULTIPART_FORM_DATA));

    assertThat(response.getStatus()).isEqualTo(200);
}

实际发生的是测试在 .post(Entity.entity(request, MediaType.MULTIPART_FORM_DATA)); 上失败,具体如下:

javax.ws.rs.ProcessingException:java.io.FileNotFoundException:在org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:287)在org.glassfish.jersey.client.ClientRuntime无效文件路径 . 在org.glassfish.jersey.client.JerseyInvocation $ 1.call(JerseyInvocation.java:684)org.glassfish.jersey.client.JerseyInvocation $ 1.call(JerseyInvocation.java:681)org上调用(ClientRuntime.java:252)位于org.glassfish.jersey.internal.Errors.process的org.glassfish.jersey.internal.Errors.process(Errors.java:297)中的.glassfish.jersey.internal.Errors.process(Errors.java:315)(错误.java:228)在org.glassfish的org.glassfish.jersey.jersey.jersey.jart.JetInvocation.invoke(JerseyInvocation.java:681)org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444) . jersey.client.JerseyInvocation $ Builder.method(JerseyInvocation.java:437)位于org.example.project.resources.CrackersTe的org.glassfish.jersey.client.JerseyInvocation $ Builder.post(JerseyInvocation.java:343) st.testPostWithFileSuccess(CrackersTest.java:201)at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.invoke:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java: 43)在org.junit.internal.runners.model的org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(FrameworkMethod.java:47)的java.lang.reflect.Method.invoke(Method.java:498)中 . ReflectiveCallable.run(ReflectiveCallable.java:12)在org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)在org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) org.junit.inun.runners.statements.RunBefores.evaluate(RunBefores.java:26)org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)at org.junit.rules.ExternalResource在org.junit.runners.ParentRunn的org.junit.rules.RunRules.evaluate(RunRules.java:20)$ 1.evaluate(ExternalResource.java:48) er.runLeaf(ParentRunner.java:271)在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)在org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)在org.junit.runners .ParentRunner $ 3.run(ParentRunner.java:238)维持在组织org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:63)在org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) . junit.runners.ParentRunner.access $ 000(ParentRunner.java:53)在org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:229)在org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.junit.runner.JUnitCore.run(JUnitCore.java:160)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:117)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42 )com.intellij.rt.exe.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarte) r.java:84)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java的.lang.reflect.Method.invoke(Method.java:498)at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)引起:java.io.FileNotFoundException:java的文件路径无效.io.FileInputStream . (FileInputStream.java:133)org.glassfish.jersey.message.internal.FileProvider.writeTo(FileProvider.java:115)org.glassfish.jersey.message.internal.FileProvider.writeTo(FileProvider . java:67)org.glassfish.jersey.media.multipart.internal.MultiPartWriter.writeTo(MultiPartWriter.java:232)at org.glassfish.jersey.media.multipart.internal.MultiPartWriter.writeTo(MultiPartWriter.java:79)在org.glfish.jersey.message.internal.WriterInterceptorExecutor $ TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:265)org.gl assfish.jersey.message.internal.WriterInterceptorExecutor $ TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:250)at atOrg.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:162)位于org.glassfish.jersey.client的org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1130) . ClientRequest.doWriteEntity(ClientRequest.java:517)org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:499)org.glassfish.jersey.client.internal.HttpUrlConnector._apply(HttpUrlConnector.java:388)在org.glassfish.jersey.client.internal.HttpUrlConnector.apply(HttpUrlConnector.java:285)... 42更多

我不完全确定,好像文件不存在或路径错误一样, Exception 会被抛出 new File(...) 声明 .

filePart 显然有问题,但是什么?如果我评论 request.bodyPart(filePart); ,则测试失败并出现比较错误(预期) .

1 回答

  • 0

    问题是 fixture(...) 方法返回 Resources.toString(Resources.getResource(filename), charset).trim() ,因此调试器看到该文件,但 post(...) 无法处理它 .

    解决问题,而不是

    new File(fixture("resources/testImage.jpg"))
    

    我应该用过

    new File(Resources.getResource("resources/testImage.jpg").toURI())
    

    完整的固定方法列表:

    @Test
    public void testPostWithFileSuccess() throws Exception
    {
        FileDataBodyPart filePart = new FileDataBodyPart("file", new File(Resources.getResource("resources/testImage.jpg").toURI()));
        filePart.setContentDisposition(FormDataContentDisposition.name("file").fileName("testImage.jpg").build());
    
        FormDataMultiPart request = new FormDataMultiPart();
        request.field("data", fixture("resources/postWithFileSuccess.json"), MediaType.APPLICATION_JSON_TYPE);
        request.bodyPart(filePart);
    
        WebTarget target = mClient.target("http://localhost:8080/crackers").register(MultiPartFeature.class);
        Response response = target
                .request()
                .post(Entity.entity(request, MediaType.MULTIPART_FORM_DATA));
    
        assertThat(response.getStatus()).isEqualTo(200);
    }
    

相关问题