Jaxrs multipart

Я пытаюсь выполнить запрос к службе jaxrs, которая имеет тип носителя, установленный в multipart/form-data. Этот запрос содержит список объектов (xml) и изображение (png, двоичный). Я создал запрос, описанный в этом потоке от BalusC.

Запрос выглядит нормально после проверки его в wirehark, за исключением ошибочной контрольной суммы ip-заголовка (говорит что-то о "может быть вызвано разгрузкой контрольной суммы IP".)

Моя большая проблема здесь заключается в том, как обрабатывать множественный запрос со стороны службы. Я не хочу включать какие-либо библиотеки из apache.cxf, resteasy или что-то в этом роде. Все, на что я хочу положиться, это jaxrs api.

Две части запроса имеют имена deliveries и signature, где подпись представляет собой файл изображения png, отправленный как двоичный файл. Список поставок должен анализироваться из xml (сущность имеет аннотацию xmlrootelement и т.д., Поэтому эта часть работает отдельно). Я попытался таким образом прочитать разные части, но это был действительно длинный снимок;

@PUT
@Path("signOff")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void signOffDeliveries(@FormParam("deliveries") List<Delivery> deliveries, @FormParam("signature")File signature) {
    //do something with the signature(image) and the list of deliveries.
}

Это не работает, и он дает мне 404 код статуса http, если я запускаю запрос на Websphere, и 415, когда я запускаю запрос на встроенный openejb (в нашей тестовой платформе интеграции). Если я удалю аннотации FormParam, запрос будет успешным.

Как я могу прочитать разные части многостраничного запроса, используя только jaxrs api?

ИЗМЕНИТЬ Итак, я привязал PUT к POST и добавил аннотацию @Encoding к параметрам следующим образом:

@POST
@Path("signOff")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void signOffDeliveries(
    @Encoded @FormParam("deliveries") String deliveries,
    @Encoded @FormParam("signature") File signature) {

}

Теперь я получаю xml в виде текстовой строки, но я не могу автоматически развязать ее в список поставок, даже если Content-Type этой части полезной нагрузки установлен на application/xml. Другая проблема заключается в том, что файл, который я получаю, имеет длину == 0, и я не могу прочитать никаких байтов из него.

Не хватает ли здесь важного пункта?

Ответ 1

Действительно, мне трудно понять, почему спецификация JAX-RS не стандартизирует поддержку для этого (я только что создал https://java.net/jira/browse/JAX_RS_SPEC-413, чтобы решить эту проблему).

Тем не менее, тем не менее, возможно поддерживать многочастные формы независимо от реализации. Либо вы пишете свою собственную форму MessageBodyReader для MultiPart, либо используете библиотеку Apache Clerezza jaxrs.utils, которая предоставляет объект MultiPartBody, соответствующий MessageBodyReader. Эта библиотека не имеет зависимости от спецификации реализации, поэтому ваше приложение будет работать в любой реализации jax-rs.

Пример использования Clerezza jaxrs.utils см. в строке 105 в http://svn.apache.org/viewvc/stanbol/trunk/development/archetypes/stateless-webmodule/src/main/resources/archetype-resources/src/main/java/MultiEnhancer.java?revision=1465777&view=markup. Если вы не используете OSGi (с регистрацией ресурсов на белой доске), вам нужно будет добавить в ваше приложение файл org.apache.clerezza.jaxrs.utils.form.MultiPartFormMessageBodyReader.

Ответ 3

Я не хочу включать какие-либо библиотеки из apache.cxf, resteasy или что-то в этом роде. Все, на что я хочу положиться, это jaxrs api

Вы не можете "полагаться" на API, поскольку он содержит только интерфейсы. Классы, которые реализуют интерфейсы, принадлежат RESTeasy, или Jersey, или CXF.

и 415, когда я запускаю запрос на встроенный openejb

415 означает "Метод не поддерживается", который происходит, когда вы отправляете запрос GET на ресурс ожидающего PUT.

Я бы рекомендовал использовать POST вместо PUT в этом случае. Я подозреваю, что @FormParam не подходит для работы с PUT в вашем конкретном случае.