泽西2.x文件上传NPE

时间:2015-07-02 04:45:53

标签: java rest tomcat jersey-2.0

大家好,

在整天摆弄并找到互联网解决方案后,我仍然无法解决这个问题。所以我需要宇宙中那些聪明的大脑来帮助我。 :-) 我正在尝试使用泽西Restful服务将文件上传到服务器。虽然我想这样做,我得到空指针异常。任何指针都将受到高度赞赏。

以下是我的环境配置:

  • JDK 1.8
  • Tomcat 8.0

Jersey Jars:

  • Jersey的媒体多-2.12.jar
  • mimepull-1.9.3.jar
  • jersey-media-moxy-2.13.jar
  • Jersey的媒体jaxb.jar
  • jersey-client-2.13.jar
  • 球衣 - 服务器 - 2.13.jar
  • 球衣-client.jar中
  • 的javax.servlet-API-3.0.1.jar

下面是我的web.xml,其中包含我的restl服务的url模式。

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  <display-name>mixtri</display-name>
    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <display-name>mixtri</display-name>
    <servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <!-- Register resources and providers under com.vogella.jersey.first package. -->
    <init-param>
    <param-name>jersey.config.server.provider.packages</param-name>
    <param-value>com.mixtri.uploader</param-value>
    </init-param>
    <init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
      </servlet-mapping>
    </web-app>

下面是一个简单的HTML表单,分别有2个按钮浏览和上传:

                <div class="container">
                    <form action="/mixtri/rest/upload" method="post" enctype="multipart/form-data">
                    <input type="file" value="browse" name="file">
                    <input type="submit" value="upload">
                    </form>
                </div>

下面是我的资源类,它有2个输入参数FormDataContentDispositionInputStream

                package com.mixtri.uploader;

                import java.io.File;
                import java.io.FileOutputStream;
                import java.io.IOException;
                import java.io.InputStream;
                import java.io.OutputStream;
                import javax.ws.rs.Consumes;
                import javax.ws.rs.POST;
                import javax.ws.rs.Path;
                import javax.ws.rs.core.MediaType;
                import javax.ws.rs.core.Response;
                import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
                import org.glassfish.jersey.media.multipart.FormDataParam;

                @Path("/")
                public class UploadFileService {

                    @POST
                    @Path("/upload")
                    @Consumes(MediaType.MULTIPART_FORM_DATA)
                    public Response uploadFile(
                        @FormDataParam("file") InputStream uploadedInputStream,
                        @FormDataParam("file") FormDataContentDisposition fileDetail) {

                        // save it
                        saveToDisk(uploadedInputStream, fileDetail);

                        String output = "D:/uploaded/" + fileDetail.getName();

                        return Response.status(200).entity(output).build();
                        //return "File Uploaded Successfully";

                    }

                    // save uploaded file to new location
                    private void saveToDisk(InputStream uploadedInputStream,
                            FormDataContentDisposition fileDetail) {

              String uploadedFileLocation = "D:/uploaded/" +                   fileDetail.getName();

                        try {
                            OutputStream out = new FileOutputStream(new File(
                                    uploadedFileLocation));
                            int read = 0;
                            byte[] bytes = new byte[1024];

                            out = new FileOutputStream(new File(uploadedFileLocation));
                            while ((read = uploadedInputStream.read(bytes)) != -1) {
                                out.write(bytes, 0, read);
                            }
                            out.flush();
                            out.close();
                        } catch (IOException e) {

                            e.printStackTrace();
                        }

                    }

                }

下面是stacktrace,它包含有关在初始几行中发送到服务器的请求的信息,然后在该空指针异常发生之后。我真的陷入了困境,无法前进

            Jul 01, 2015 6:58:49 PM org.glassfish.jersey.filter.LoggingFilter log
            INFO: 3 * Server has received a request on thread http-nio-8080-exec-8
            POST http://localhost:8080/mixtri/rest/upload
            accept: text/html, */*; q=0.01
            accept-encoding: gzip, deflate
            accept-language: en-US,en;q=0.8
            connection: keep-alive
            content-length: 0
            cookie: JSESSIONID=CA18D302131AAB8DD4A77EFF95DD4A45
            host: localhost:8080
            origin: http://localhost:8080
            referer: http://localhost:8080/mixtri/sample.jsp
            user-agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36
                    x-requested-with: XMLHttpRequest
                    Jul 01, 2015 6:58:49 PM org.apache.catalina.core.StandardWrapperValve invoke
                    SEVERE: Servlet.service() for servlet [Jersey REST Service] in context with path [/mixtri] threw exception [java.lang.NullPointerException] with root cause
                    java.lang.NullPointerException
                    at org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider$FormDataParamValueFactory.provide(FormDataParamValueFactoryProvider.java:205)
                    at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:81)
                    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:121)
                    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:152)
                    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:104)
                    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:384)
                    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:342)
                    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:101)
                    at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:271)
                    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
                    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
                    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
                    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
                    at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
                    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:297)
                    at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:254)
                    at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:1030)
                    at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:373)
                    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:381)
                    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:344)
                    at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:221)
                    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
                    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
                    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
                    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
                    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
                    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
                    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
                    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
                    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
                    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
                    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)
                    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
                    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
                    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
                    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)
                    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)
                    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)
                    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
                    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
                    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
                    at java.lang.Thread.run(Unknown Source)
                    ***

0 个答案:

没有答案