android - 通过 android 将图像上传到 RESTful web 服务,给出 NoSuchMethodError

标签 android web-services jersey multipartform-data nosuchmethoderror

我当前的应用正在拍照。拍完照片后,它应该会自动将照片发送到我的网络服务,这样我就可以看到它保存在我的电脑上,只是为了入门。

我目前android部分的代码如下:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE_CONTENT_RESOLVER) {
        if (resultCode == RESULT_OK) {
            String[] projection = { MediaStore.MediaColumns._ID,
                    MediaStore.Images.ImageColumns.ORIENTATION,
                    MediaStore.Images.Media.DATA };
            Cursor cursor = getContentResolver().query(imageFilePath,
                    projection, null, null, null);
            cursor.moveToFirst();
            imageFileName = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
            Toast.makeText(this, imageFileName, Toast.LENGTH_LONG).show();
            Log.i("Image", imageFileName);
            Log.i("Image", imageFilePath.toString());
            try {
                bm = BitmapFactory.decodeFile(imageFileName);
                if (bm == null) {
                    throw new Exception("no picture!");
                }
                new FetchItemsTask().execute();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
};

class FetchItemsTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        try {
            Log.i("Response", "Entered doInBackground");
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            bm.compress(CompressFormat.JPEG, 50, bos);
            byte[] data = bos.toByteArray();

            HttpClient httpClient = new DefaultHttpClient();
            HttpPut putRequest = new HttpPut(URL_SERVER);
            Log.i("Response", "Sending HTTP to "
                    + putRequest.getURI().toASCIIString());
            File file = new File(imageFileName);
            ByteArrayBody bab = new ByteArrayBody(data, file.getName());
            MultipartEntity reqEntity = new MultipartEntity(
                    HttpMultipartMode.BROWSER_COMPATIBLE);
            reqEntity.addPart("image", bab);
            putRequest.setEntity(reqEntity);
            Log.i("Response", "postRequest is: " + putRequest);
            HttpResponse response = httpClient.execute(putRequest);
            Log.i("Response", "Response is: " + response);
            Log.i("Response", "Status is: " + response.getStatusLine());
            BufferedReader newReader = new BufferedReader(new FileReader(imageFileName));
            //BufferedReader reader = new BufferedReader(
            //      new InputStreamReader(
            //              response.getEntity().getContent(), "UTF-8"));
            String sResponse;
            StringBuilder s = new StringBuilder();
            while ((sResponse = newReader.readLine()) != null) {
                s = s.append(sResponse);
            }
        } catch (Exception e) {
            // handle exception here
            e.printStackTrace();
        }
        return null;
    }
}

对于我的网络服务,我的代码是这样的:

@PUT
@Consumes({MediaType.MULTIPART_FORM_DATA})
@Produces({MediaType.TEXT_PLAIN})
@Path("/image")
public Response uploadImage(
        @FormDataParam("image") InputStream fileInputStream,
        @FormDataParam("image") FormDataContentDisposition contentDispositionHeader) {
    String filePath = SERVER_UPLOAD_LOCATION_FOLDER + contentDispositionHeader.getFileName();

    // save the file to the server
    saveToFile(fileInputStream, filePath);
    String output = "File saved to server location : " + filePath;
    return Response.status(200).entity(output).build();
}

我的日志文件告诉我这一点,但我无法找出问题所在。

HTTP/1.1 500 Internal Server Error
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=utf-8
Content-Language: en
Content-Length: 8100
Date: Fri, 28 Nov 2014 13:02:30 GMT
Connection: close

<!DOCTYPE html><html><head><title>Apache Tomcat/8.0.15 - Error report</title><style type="text/css">H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}.line {height: 1px; background-color: #525D76; border: none;}</style> </head><body><h1>HTTP Status 500 - org.glassfish.jersey.server.ContainerException: java.lang.NoSuchMethodError: org.glassfish.jersey.server.CloseableService.add(Ljava/io/Closeable;)V</h1><div class="line"></div><p><b>type</b> Exception report</p><p><b>message</b> <u>org.glassfish.jersey.server.ContainerException: java.lang.NoSuchMethodError: org.glassfish.jersey.server.CloseableService.add(Ljava/io/Closeable;)V</u></p><p><b>description</b> <u>The server encountered an internal error that prevented it from fulfilling this request.</u></p><p><b>exception</b></p><pre>javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoSuchMethodError: org.glassfish.jersey.server.CloseableService.add(Ljava/io/Closeable;)V
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:393)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:66)
com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
</pre><p><b>root cause</b></p><pre>org.glassfish.jersey.server.ContainerException: java.lang.NoSuchMethodError: org.glassfish.jersey.server.CloseableService.add(Ljava/io/Closeable;)V
org.glassfish.jersey.servlet.internal.ResponseWriter.rethrow(ResponseWriter.java:256)
org.glassfish.jersey.servlet.internal.ResponseWriter.failure(ResponseWriter.java:238)
org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:439)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1030)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:66)
com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
</pre><p><b>root cause</b></p><pre>java.lang.NoSuchMethodError: org.glassfish.jersey.server.CloseableService.add(Ljava/io/Closeable;)V
org.glassfish.jersey.media.multipart.internal.MultiPartReaderServerSide.readMultiPart(MultiPartReaderServerSide.java:90)
org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:179)
org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:91)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:258)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:234)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:154)
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:73)
org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:154)
org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1124)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:851)
org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:783)
org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:233)
org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider.getEntity(FormDataParamValueFactoryProvider.java:369)
org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider.access$000(FormDataParamValueFactoryProvider.java:86)
org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider$FormDataParamValueFactory.provide(FormDataParamValueFactoryProvider.java:201)
org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:81)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:121)
org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152)
org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:384)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:342)
org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101)
org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
org.glassfish.jersey.internal.Errors.process(Errors.java:315)
org.glassfish.jersey.internal.Errors.process(Errors.java:297)
org.glassfish.jersey.internal.Errors.process(Errors.java:267)
org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1030)
org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:66)
com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)
com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)
</pre><p><b>note</b> <u>The full stack trace of the root cause is available in the Apache     Tomcat/8.0.15 logs.</u></p><hr class="line"><h3>Apache Tomcat/8.0.15</h3></body></html>

还有这个:

28-Nov-2014 14:02:30.252 INFO [http-nio-8080-exec-161] org.glassfish.jersey.filter.LoggingFilter.log 6 * Server has received a request on thread http-nio-8080-exec-161
6 > PUT http://127.0.0.1:9876/webservice-1.0-SNAPSHOT/DirectorResource/image
6 > connection: Keep-Alive
6 > content-length: 16038
6 > content-type: multipart/form-data; boundary=IdmG6B4wBROo8soEP9rPHGgqDxSThQJGb
6 > host: 127.0.0.1:9876
6 > user-agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
--IdmG6B4wBROo8soEP9rPHGgqDxSThQJGb
Content-Disposition: form-data; name="image"; filename="1417179326131.jpg"
Content-Type: application/octet-stream

如果您需要更多代码,请告诉我,但我认为这就是所需要的。谢谢!

最佳答案

我也有这个问题,我通过在我的 pom.xml 文件中将我所有的 Jersey 库升级到 2.9 来修复它。我认为我的问题的根本原因是 jersey-container-servlet、jersey-container-servlet-core 和 jersey-media-multipart 库不是同一版本。我有 2.8 个 jersey-container-servlet-core 和 jersey-container-servlet,以及 2.7 个 jersey-media-multipart。

关于android - 通过 android 将图像上传到 RESTful web 服务,给出 NoSuchMethodError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27189517/

相关文章:

java - 将通用类型列表添加到另一个

java - SoundPool: "path"中的 "load(String path, int priority)"是什么

web-services - #!在 URL 中,它是什么意思?

java - 如何从 Android 调用 RESTful Web 服务?

scala - 如何扩展使用 Akka 的 Scala REST 应用程序?

android - 将所有 URL 重定向到我的应用

android - 从 Fragment 中的适配器(recyclerview)获取所有项目

java - 将 jar 作为 web 服务运行?

Java Jersey 找不到资源

rest - Payara 5 中的日期格式已更改(Long 不再有效)-- org.eclipse.yasson.YassonProperties#ZERO_TIME_PARSE_DEFAULTING