Amdatu multi-part-form @FormParam всегда равен нулю

Поэтому я использую Amdatu в рамках Felix для создания службы отдыха JSON с поддержкой OSGi.

Когда я использую @GET, я получаю значение идентификатора, как и ожидалось

@GET
@Produces(MediaType.APPLICATION_JSON)
@Path("file")
public String getFile(@QueryParam("id") String id) {
    System.out.println("id : "+id);
    return null;
}

Когда я использую @POST FormParam всегда нулевой

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("file")
public String getFile(@FormParam("id") String id) {
       System.out.println("id : "+id);
       return null;
}

Когда я использую @POST, но с приложением JSON, я всегда получаю весь сырой json, а не значение.

Я следил за этим видео: http://www.amdatu.org/howto/createwebapp.html

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("file")
public String getFile(String id) throws Exception { 
    return id
}

Я использую расширенный клиентский плагин отдыха для Chrome, чтобы проверить сервис.

Использование библиотек

org.amdatu.web.rest.jaxrs:1.0.4
org.amdatu.web.rest.wink:1.0.8
jackson-jaxrs:1.9.13
jackson-mapper-asl:1.9.13
jackson-core-asl:1.9.13

Обновить:

У меня были зависимости в моем maven-пакете, установленные на "предоставленные", изменив их на "compile" MediaType.APPLICATION_FORM_URLENCODED теперь работает.

Но MediaType.MULTIPART_FORM_DATA по-прежнему нет.

Во время публикации формы мой заголовок:

Content-Type: multipart/form-data

если я удаляю @FormParam, тогда id заполняется:

id : --ARCFormBoundary5xbnwa6as8aor
Content-Disposition: form-data; name="id"

9
--ARCFormBoundary5xbnwa6as8aor--

в тот момент, когда я добавляю @FormParam, значение равно нулю.

2 ответа

Решение

Спецификация JAX-RS ничего не говорит о том, как должны обрабатываться multipart/form-data. Различные реализации JAX-RS имеют собственные запатентованные способы решения этой проблемы. Насколько я могу найти, Apache Wink (который мы строим поверх) не поддерживает @FormParam для multipart. Кажется, в Wink есть несколько типов поддержки для нескольких частей: http://wink.apache.org/documentation/1.1.1/html/7.8%20MultiPart.html но эти классы не предоставляются пакетом Amdatu Wink, и я никогда не пытался использовать это либо.

Обходной путь, который я использую сам, является примером ниже. Это полезно, когда multipart используется для загрузки файлов вместе с другими полями формы (именно поэтому в основном используется multipart). Я использую Apache File Upload для анализа запроса и получения доступа как к загруженным файлам, так и к полям формы.

@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void test(@Context HttpServletRequest request) {
    ServletFileUpload uploader = new ServletFileUpload(new DiskFileItemFactory());
    try {
        List<FileItem> parseRequest = uploader.parseRequest(request);
        for (FileItem fileItem : parseRequest) {
            if (fileItem.isFormField()) {
                System.out.println(fileItem.getFieldName() + ": "
                        + fileItem.getString());
            }

        }
    } catch (FileUploadException e) {
        e.printStackTrace();
    }
}

Похоже, вы используете неправильный Mediatype в @Consumes.

Я создал пример (см. Ниже), который принимает параметр из формы, либо полностью пропустив @Consumes, либо установив его в MediaType.APPLICATION_FORM_URLENCODED.

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void test(@FormParam("id") String id) {
    System.out.println(id);
}

HTML

<form action="/agenda" method="post">
<input type="id" name="id"/>
<input type="submit" value="Test">
</form>
Другие вопросы по тегам