Multipart в jersey 2.x: клиенту Java не удалось найти средство записи для типа содержимого multipart / form-data - PullRequest
0 голосов
/ 08 июля 2019

У меня был проект с jersey 1.x зависимостями.Я решил обновить его до jersey 2.x и изменил все зависимости, относящиеся к джерси 1.x.

Не получая конкретной ошибки, независимо от того, что я изменяю, я получаю javax.ws.rsСообщение .ProcessingException, вызванное:

Caused by: javax.ws.rs.ProcessingException: could not find writer for content-type multipart/form-data type: org.glassfish.jersey.media.multipart.MultiPart

Полное сообщение:

Exception in thread "main" javax.ws.rs.ProcessingException: Unable to
invoke request  at
org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:287)
    at
org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:407)
    at
 org.jboss.resteasy.client.jaxrs.internal.ClientInvocationBuilder.post(ClientInvocationBuilder.java:195)
    at
 gr.service.ws0.test.Prot_DocClient.callWs01(Prot_DocClient.java:127)
    at
 gr.service.ws0.test.Prot_DocClient.testNewProtocol(Prot_DocClient.java:63)
    at
 gr.service.ws0.test.Prot_DocClient.main(Prot_DocClient.java:45)
 Caused by: javax.ws.rs.ProcessingException: could not find writer for
 content-type multipart/form-data type:
 org.glassfish.jersey.media.multipart.MultiPart     at
> org.jboss.resteasy.core.interception.ClientWriterInterceptorContext.throwWriterNotFoundException(ClientWriterInterceptorContext.java:40)
>   at
> org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.getWriter(AbstractWriterInterceptorContext.java:138)
    at
 org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:117)
    at
 org.jboss.resteasy.plugins.interceptors.encoding.GZIPEncodingInterceptor.aroundWriteTo(GZIPEncodingInterceptor.java:100)
    at
 org.jboss.resteasy.core.interception.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:122)
    at
 org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.writeRequestBody(ClientInvocation.java:341)
    at
 org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.writeRequestBodyToOutputStream(ApacheHttpClient4Engine.java:558)
    at
org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.buildEntity(ApacheHttpClient4Engine.java:524)
    at
 org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.loadHttpMethod(ApacheHttpClient4Engine.java:423)
    at
 org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:281)
    ... 5 more

Строки в коде, к которому относится ошибка , выглядят так:

//final ClientConfig config = new ClientConfig();
        final Client client = ClientBuilder.newClient();
        //client.addFilter(new LoggingFilter(System.out));
        final WebTarget target = client.target(urlString);
        MultiPart multiPart = new MultiPart();
         multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
        //multiPart.bodyPart(new BodyPart(inParams.toString(), MediaType.TEXT_PLAIN_TYPE));
        if(mode==CALL_INSERT_DOC){
            //final File fileToUpload = new File(filePath);
            FileDataBodyPart fileDataBodyPart = new FileDataBodyPart("file",
                    new File(filePath),
                    MediaType.APPLICATION_OCTET_STREAM_TYPE);
                multiPart.bodyPart(fileDataBodyPart);
            //multiPart.bodyPart(new BodyPart(fileToUpload, MediaType.MULTIPART_FORM_DATA_TYPE));// APPLICATION_OCTET_STREAM_TYPE
        }


        // POST the request
        Response clientResp = target.request(MediaType.APPLICATION_JSON_TYPE)
                .post(Entity.entity(multiPart, multiPart.getMediaType()));
        //final Response clientResp =target.request().post(Entity.entity(multiPart, MediaType.MULTIPART_FORM_DATA));

        System.out.println("Response: " + clientResp.getStatus());
        JSONObject response = clientResp.readEntity(JSONObject.class);
        System.out.println(response);

        client.close();

Вот мой 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>SERVICE</groupId>
  <artifactId>SERVICE</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <name>KalamariaWebService</name>
  <description>...</description>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <resources>
      <resource>
        <directory>src</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>
    </resources>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>3.2.1</version>
        <configuration>
          <warSourceDirectory>WebContent</warSourceDirectory>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.6</version>
    </dependency>
    <dependency>
        <groupId>commons-configuration</groupId>
        <artifactId>commons-configuration</artifactId>
        <version>1.10</version>
    </dependency>
    <dependency>
        <groupId>org.codehaus.jettison</groupId>
        <artifactId>jettison</artifactId>
        <version>1.4.0</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.10</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-client</artifactId>
        <version>2.5.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.3</version>
    </dependency>
    <dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
    <version>2.29</version>
</dependency>
<dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-multipart</artifactId>
        <version>2.26</version>
    </dependency>


    <dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-common</artifactId>
    <version>2.29</version>
</dependency>

  </dependencies>
</project>

У меня есть разные возможные решения, но я не могу выяснить, в чем именно заключается проблема.

Это какая-то коллизия между зависимостями?Чего-то не хватает?

Мне было интересно, возможно, multipart не полностью поддерживается в jersey 2 .x (по крайней мере, не так, как я это воспринимаю), потому что я не смог найти какую-либо документацию.

Даже руководство илибыло бы очень полезно найти место.

...