当前位置: 首页 > 知识库问答 >
问题:

未找到类型为public javax.ws.rs.core.response-jersey-multipartFeature的参数的注入源

傅琦
2023-03-14

我正在创建一个web服务,其中嵌入了Jersey和Jetty,没有web.xml文件。它很简单,它通过一个HTML表单的POST接收一个二进制文件。看来我没有正确注册MultiPart特性,因为当我尝试将它与HTML表单一起使用时,我会出现以下错误:

multipart_form_data:未找到public javax.ws.rs.core.response类型参数的注入源

多部分formdata的Jersey 2注入源

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

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

}
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");


        }

}
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个答案

龙高歌
2023-03-14

我在您的代码库中看到了三个不同的resourceConfig,但没有一个实际用于应用程序。因此multipartfeature是never register,这就是导致错误的原因。关于如何在您的情况下使用resourceConfig,您有几个选项。

>

  • 您可以通过传入ResourceConfig实例来实例化ServletContainer。不幸的是,没有ServletContextHolder#AddServlet(Servlet)方法,但有一个ServletContextHolder#AddServlet(ServletHolder)方法,因此我们需要将ServletContainer包装在一个ServletHolder

    ServletHolder jerseyServlet = new ServletHolder(new ServletContainer(resourceConfig));
    servletContextHolder.addServlet(jerseyServlet, "/*");
    

    使用上面的选项,您可以使用本地实例或子类,但是如果您只有一个子类,就像您的第一个代码一样,那么您可以添加一个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());
    

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

    不使用ResourceConfig,您可以只使用init参数注册MulitPartFeature

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

  •  类似资料:
    • 我正在使用基于Jersey的restful服务实现策略来构建一个用于上传文件的服务。我的服务类名是:UploadFileService.java(参见下面的代码)

    • 我正在尝试使用multipart/form-data为JAX-RS上传文件。当我尝试启动服务器时,它会给我以下错误: 是不是缺少了什么,或者配置不正确?我是个新手,所以对我宽容点...:)

    • 问题内容: 我正在使用基于Jersey的Restful Service实施策略来构建将用于上传文件的服务。我的服务类名称是:UploadFileService.java(请参见下面的代码) 这些是我在lib中拥有的JAR文件: 尝试启动tomcat服务器时出现以下错误: org.glassfish.jersey.server.model.ModelValidationException: Vali

    • 我想从ReactJS上传一个文件到Java后端。但它会在我上传的每个文件上添加以下内容: 警告:在索引3处找不到类型为public javax.ws.rs.core.response pilotage.rest.incidents.incidenteditiqueservice.uploadFile(javax.ws.rs.core.HttpHeaders,java.lang.Integer,ja

    • 尝试将多部分功能用于我的泽西岛 3 Web 应用程序。不幸的是,似乎没有找到注射源... pom.xml web.xml endpoint 我一直在看其他帖子,在我看来,我有正确的依赖项,我还在我的web.xml.中注册了Multipart-Feature,我错过了什么? 感谢您的任何意见!

    • 是使用Swagger Codegen生成的实现,模型类也是如此。我在这个类中还有几个其他函数,但每当我将函数保留为未注释状态时,就会收到以下错误: 我发现的所有其他类似的问题都与和文件上载有关,而我只是提出一个简单的请求。其他同样使用类的函数没有这个问题,服务器正常启动。 我注意到,每当类在参数中时(即和)就会出现问题,但我一直无法找出原因。此外,是由Swagger Codegen选择的,我不愿意