找不到类型为public javax.ws.rs.core.Response的参数的注入源 - Jersey - MultiPartFeature

时间:2016-02-10 01:47:54

标签: rest jersey jetty multipartform-data multipart

我使用Jersey和Jetty Embedded创建了一个没有web.xml文件的Web服务。它非常简单,它通过POST从HTML表单接收二进制文件。我似乎没有正确注册MultiPart功能,因为当我尝试使用HTML表单时,我收到此错误:

*

  

警告:找不到public类型参数的注入源   javax.ws.rs.core.Response   org.multipart.demo.ReceiveFile.postMsg(java.io.InputStream中,org.glassfish.jersey.media.multipart.FormDataContentDisposition)   在索引0处抛出java.lang.Exception。2016-02-09   21:49:59.916:警告:/:qtp1364335809-16:不可用   org.glassfish.jersey.server.model.ModelValidationException:验证   应用程序期间应用程序资源模型失败   初始化。| [[FATAL]找不到参数的注入源   键入public javax.ws.rs.core.Response   org.multipart.demo.ReceiveFile.postMsg(java.io.InputStream中,org.glassfish.jersey.media.multipart.FormDataContentDisposition)   在索引0处抛出java.lang.Exception。   源=' {ResourceMethod =列举HTTPMethod POST,   consumeTypes = [multipart / form-data],generatedTypes = [text / plain],   suspended = false,suspendTimeout = 0,

  • 我几周来一直在寻找解决方案,我已经在StackOverflow上阅读了与此错误相关的所有问题,例如:

MULTIPART_FORM_DATA: No injection source found for a parameter of type public javax.ws.rs.core.Response

Jersey 2 injection source for multipart formdata

他们没有帮助我,因为我没有使用web.xml

我有3节课 - ReceiveFile.class(尝试接收POST) - resourceConfig.class(尝试注册MultiPart功能) - JettyServer.class(创建服务器实例)

ReceiveFile.class

package org.multipart.demo;
import java.io.InputStream;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
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("/resources")
public class ReceiveFile 
{

        @POST
        @Path("/fileUpload")
        @Produces("text/plain")
        @Consumes(MediaType.MULTIPART_FORM_DATA)
        public Response postMsg (
                @FormDataParam("file") InputStream stream,
                @FormDataParam("file") FormDataContentDisposition fileDetail) throws Exception {


                    Response.Status respStatus = Response.Status.OK;




                    return Response.status(respStatus).build();
                    }

}

resourceConfig.class

package org.multipart.demo;
import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

import org.glassfish.jersey.media.multipart.MultiPart;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;


    /**
     * Registers the components to be used by the JAX-RS application  
     *
     */
@ApplicationPath("/resources/fileUpload")
public class resourceConfig extends ResourceConfig {

     /**
        * Register JAX-RS application components.
        */  

        public resourceConfig(){
            register(ReceiveFile.class);    
            register(JettyServer.class);
            register(MultiPartFeature.class);
            //packages("org.glassfish.jersey.media", "com.mypackage.providers");


        }

}

JettyServer.class

package org.multipart.demo;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.DefaultHandler;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.ServerProperties;


public class JettyServer
{
    //   private static final Logger LOGGER = Logger.getLogger(UploadFile.class.getName()); 


public static void main(String[] args) throws Exception
{

    ResourceConfig config = new ResourceConfig();
    config.packages("org.multipart.demo");

    Server jettyServer = new Server(8080);

    ResourceHandler resource_handler = new ResourceHandler();

    // Configure the ResourceHandler. Setting the resource base indicates where the files should be served out of.
    // In this example it is the current directory but it can be configured to anything that the jvm has access to.
    resource_handler.setDirectoriesListed(true);
    resource_handler.setWelcomeFiles(new String[]{ "./index.html" , "./html/FileUpload.html"  });
    resource_handler.setResourceBase(".");

    //Jersey ServletContextHandler
    final ResourceConfig resourceConfig = new ResourceConfig(ReceiveFile.class);
    resourceConfig.register(MultiPartFeature.class);

    ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
    ServletHolder jerseyServlet = servletContextHandler.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*" );
    jerseyServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "org.multipart.demo");

    // Add the ResourceHandler to the server.
    HandlerList handlers = new HandlerList();
    handlers.setHandlers(new Handler[] { resource_handler, servletContextHandler, new DefaultHandler() });
    jettyServer.setHandler(handlers);

    try {
        jettyServer.start();
        jettyServer.join();
    } finally {
        jettyServer.destroy();
    }
}


}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>org</groupId>
  <artifactId>multipart.demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>multipart.demo</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
  <dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>9.2.3.v20140905</version>
  </dependency>
  <dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-servlet</artifactId>
    <version>9.2.3.v20140905</version>
  </dependency>
  <dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.7</version>
  </dependency>
  <dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.7</version>
  </dependency>
  <dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-jetty-http</artifactId>
    <version>2.7</version>
  </dependency>
  <dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-moxy</artifactId>
    <version>2.7</version>
  </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
 <dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
    <version>2.7</version>
</dependency>
 <dependency>
    <groupId>org.jvnet.mimepull</groupId>
    <artifactId>mimepull</artifactId>
    <version>1.9.6</version>
</dependency>
  </dependencies>
</project>

提前致谢!

1 个答案:

答案 0 :(得分:3)

我在您的代码库中看到了三个不同的ResourceConfig,但实际上它们的 none 用于应用程序。所以MultiPartFeature永远不会注册,这就是造成错误的原因。您可以选择如何在案例中使用ResourceConfig

  1. 您可以实例化ServletContainer,传入ResourceConfig实例。不幸的是,没有ServletContextHolder#addServlet(Servlet)方法,但有ServletContextHolder#addServlet(ServletHolder)方法,因此我们需要将ServletContainer包装在ServletHolder

    ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(resourceConfig));
    servletContextHolder.addServlet(jerseyServlet, "/*");
    
  2. 使用上面的选项,您可以使用本地实例或子类,但如果您只有一个子类,就像您的第一段代码一样,那么您添加一个servlet init param,它指定{{1子类。

    ResourceConfig

    注意我设置应用程序类名称的最后一次调用。

  3. 不使用ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); ServletHolder jerseyServlet = servletContextHandler.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*" ); jerseyServlet.setInitParameter(ServerProperties.PROVIDER_PACKAGES, "org.multipart.demo"); jerseyServlet.setInitParameter(ServletProperties.JAXRS_APPLICATION_CLASS, resourceConfig.class.getCanonicalName()); ,您只需使用init参数注册ResourceConfig

    MulitPartFeature