在Tomcat 9上的Jesery 2中使用multipart_form_data时,REST服务失败

时间:2019-02-19 22:38:59

标签: java tomcat jersey multipartform-data jersey-2.0

我还有其他几种服务正在运行,但是如果我包括以下上传文件的方法,它们将失败:

@POST
@Path("/image2")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Response uploadImage(@FormDataParam("file") InputStream uploadedInputStream,
                            @FormDataParam("file") FormDataContentDisposition fileDetails)
        throws ServletException, IOException {

    System.out.println(fileDetails.getFileName());
    return Response.ok().build();
}

enter image description here

没有上述方法,其他服务将正常工作。

enter image description here

这是我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
     xmlns="http://java.sun.com/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <display-name>Talent Core</display-name>
 <servlet>
   <servlet-name>javax.ws.rs.core.Application</servlet-name>
 </servlet>
 <servlet-mapping>
   <servlet-name>javax.ws.rs.core.Application</servlet-name>
   <url-pattern>/service/*</url-pattern>
  </servlet-mapping>
  <listener>
    <listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
  </listener>

  <filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
      <init-param>
        <param-name>cors.allowed.origins</param-name>
        <param-value>*</param-value>
      </init-param>
      <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
      </init-param>
      <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Content-Type,X-Requested-With,Accept,Accept-Encoding,Accept-Language,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,Connection,Host,authorization</param-value>
      </init-param>
      <init-param>
        <param-name>cors.exposed.headers</param-name>
        <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
      </init-param>
    </filter>

    <filter-mapping>
      <filter-name>CorsFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

    <resource-env-ref>
     <resource-env-ref-name>BeanManager</resource-env-ref-name>
     <resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
    </resource-env-ref>
 </web-app>

环境:

  • Jdk 8
  • Tomcat 9

我按照此处的建议MULTIPART_FORM_DATA: No injection source found for a parameter of type public javax.ws.rs.core.Response尝试过,但是存在相同的错误。

2 个答案:

答案 0 :(得分:1)

听起来这则帖子可能适用:

  

Why would “java.lang.IllegalStateException: The resource configuration is not modifiable in this context.” appear deploying Jersey app?

     

就我而言,我有一个Jersey POST资源可用于文件上传。的   资源指定了参数:

@FormDataParam("file") InputStream file
     

并消耗

MediaType.MULTIPART_FORM_DATA
     

要解决此问题,我必须将以下内容添加到Jersey REST中   我的web.xml文件中的配置:

<init-param>
    <param-name>jersey.config.server.provider.classnames</param-name>
    <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
</init-param>

原始问题:HTTP 500在Tomcat / Jersey下执行文件上传:java.lang.IllegalStateException: The resource configuration is not modifiable in this context.

解决方案:将org.glassfish.jersey.media.multipart.MultiPartFeature添加到web.xml。

新问题:404- Not Found

建议:

  1. 进入调试器,看看您的代码是否甚至到达uploadImage()

  2. 如果是,则将文件名和文件路径从fileDetails打印到System.out。确保fileDetails不为null,并且该文件实际存在。

  3. 否则,请在调用“ uploadImage()”的代码中设置一个断点,并确保它传递了要上传的有效文件名和文件路径。

请发回找到的内容。

答案 1 :(得分:0)

这是一个可行的解决方案。我正在使用web.xml注册该类,并且由于某种原因而无法正常工作。我改为使用应用程序而不是web.xml

在根(/ tf-core / src / main / java / com / tf / core)下添加了新的类 ApplicationConfig

import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.media.multipart.MultiPartFeature;

@ApplicationPath("service") // set the path to REST web services
public class ApplicationConfig extends ResourceConfig {
  public ApplicationConfig() {
    packages("com.tf.core").register(MultiPartFeature.class);
  }
}

Servlet类(位于/ tf-core / src / main / java / com / tf / core / servlet):

@POST
@Path("/image")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public ResponseBean uploadImage(@FormDataParam("file") InputStream uploadedInputStream,
                                @FormDataParam("file") FormDataContentDisposition fileDetails) {
    System.out.println(fileDetails.getFileName());
    ...
}

pom.xml

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-multipart</artifactId>
  <version>2.27</version>
</dependency>

Github上的完整示例