Grails JAX-RS REST многочастная загрузка файла - PullRequest
0 голосов
/ 04 апреля 2019

Попытка загрузить многокомпонентный файл для работы на ресурсе Grails 2.5.4.

Мне бы очень хотелось использовать готовые функции Spring, но я не могу найти пример для моего конкретного случая.

Я звоню в API от Почтальона. Тело с form-data и один файл PDF, прикрепленный в поле file. Никаких других заголовков!

Первая попытка

@POST
@Path("/pdf")
Response createPdf(MultipartFile file)

Возвращает 415 Unsuported Media Type в Почтальоне, и это на сервере:

[...] ERROR container.ContainerRequest  - A message body reader for Java class org.springframework.web.multipart.MultipartHttpServletRequest [...]
The registered message body readers compatible with the MIME media type are:
*/* ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
  com.sun.jersey.core.impl.provider.entity.DocumentProvider
  com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
  com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
  com.sun.jersey.core.impl.provider.entity.EntityHolderReader
  com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
  com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General

Добавление @Consumes(MediaType.MULTIPART_FORM_DATA) не помогает.

Я пробовал другие параметры, такие как MultipartHttpServletRequest, но до сих пор нет программы чтения тела сообщения.

Вторая попытка

@POST
@Path("/pdf")
@Consumes(MediaType.MULTIPART_FORM_DATA)
Response createPdf(@FormDataParam("file") InputStream uploadedInputStream,
                       @FormDataParam("file") FormDataContentDisposition fileDetail) 

Возвращает ошибку 500, и это на сервере:

SEVERE: Missing dependency for method public javax.ws.rs.core.Response com.carfax.VehicleReceiptPhotoResource.createPdf(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) at parameter at index 0
SEVERE: Missing dependency for method public javax.ws.rs.core.Response createPdf(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition) at parameter at index 1
SEVERE: Method, public javax.ws.rs.core.Response createPdf(java.io.InputStream,org.glassfish.jersey.media.multipart.FormDataContentDisposition), annotated with POST of resource, class com.carfax.VehicleReceiptPhotoResource, is not recognized as valid resource method.

имея эти зависимости

compile group: 'com.sun.jersey', name: 'jersey-bundle', version: '1.19.4'
compile group: 'com.sun.jersey', name: 'jersey-json', version: '1.19.4'

compile "javax.ws.rs:javax.ws.rs-api:2.1@jar"
compile ('org.glassfish.jersey.media:jersey-media-multipart:2.27') {
    exclude group:'javax.ws.rs'
}
compile group: 'org.jvnet.mimepull', name: 'mimepull', version: '1.9.11'

Третья попытка

@POST
@Path("/pdf")
Response createPdf(@FormDataParam("file") InputStream fileInputStream)

При тех же зависимостях джерси, что и во второй попытке, это работает, но для меня этого недостаточно. Я хотел бы загрузить несколько файлов одновременно и получить дополнительную информацию о JSON на стороне.

Что я хочу

  • Некоторые пояснения о том, сколько способов загрузки нескольких файлов существует в Grails
  • Какие библиотеки достигают этого
  • Чтобы сделать это в REST-ресурсе Grails, а не в контроллере

Некоторые ссылки, через которые я прошел

...