【问题标题】:No injection source found for a parameter of type public javax.ws.rs.core.Response - Jersey - MultiPartFeature找不到公共 javax.ws.rs.core.Response - Jersey - MultiPartFeature 类型的参数的注入源
【发布时间】:2016-02-10 01:47:53
【问题描述】:

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

*

警告:未找到公共类型参数的注入源 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:WARN:/:qtp1364335809-16:不可用 org.glassfish.jersey.server.model.ModelValidationException:验证 应用程序资源模型的应用程序在应用程序期间失败 初始化。|[[致命] 未找到参数的注入源 键入公共 javax.ws.rs.core.Response org.multipart.demo.ReceiveFile.postMsg(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) 在索引 0 处抛出 java.lang.Exception。; 来源='资源方法{httpMethod=POST, consumeTypes=[multipart/form-data],producedTypes=[text/plain], 暂停=假,暂停超时=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>

提前致谢!

【问题讨论】:

    标签: rest jersey jetty multipartform-data multipart


    【解决方案1】:

    我在您的代码库中看到三个不同的ResourceConfigs,但没有一个实际上用于应用程序。所以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 参数,指定 ResourceConfig 子类。

      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());
      

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

    3. 不使用ResourceConfig,您只需使用初始化参数注册MulitPartFeature

      jerseyServlet.setInitParameter(ServerProperties.PROVIDER_CLASSNAMES, MultiPartFeature.class.getCanonicalName());
      

    【讨论】:

    • 非常感谢,它有效。非常感谢您的帮助
    猜你喜欢
    • 2015-08-19
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多