Службы REST не работают с использованием multipart_form_data в Jesery 2 на Tomcat 9 - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть несколько других служб, которые работают, но они не будут работать, если я включу следующий метод для загрузки файла:

@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: Источник параметра не найден для параметравведите public javax.ws.rs.core.Response , но та же ошибка.

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Вот решение, которое сработало.Я использовал web.xml для регистрации класса и по какой-то причине, которая не работала.Я изменил использование Application вместо web.xml

. Добавлен новый класс ApplicationConfig под root (/ tf-core / src / main / java / com / tf / core):

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

Класс сервлета (at / 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

0 голосов
/ 20 февраля 2019

Похоже, что этот пост может быть применим:

Почему «java.lang.IllegalStateException: конфигурация ресурса не может быть изменена в этом контексте.» Появляется развертывание приложения Джерси?

В моем случае у меня был ресурс Jersey POST для загрузки файлов.Ресурс указывал параметр:

@FormDataParam("file") InputStream file

и потреблял

MediaType.MULTIPART_FORM_DATA

Чтобы устранить эту проблему, мне пришлось добавить следующее в конфигурацию 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 (), и убедитесь, что он передаетдопустимое имя файла и путь к файлу для загрузки.

Пожалуйста, отправьте обратно, что вы найдете.

...