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>