2014-02-08 4 views
0

그래서 Felix 프레임 워크에서 Amdatu를 사용하여 OSGi 사용 가능 JSON 휴식 서비스를 만듭니다. 내가 사용하는 경우Amdatu 다중 파트 양식 @FormParam은 항상 null

은 @GET 내가

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

을 예상대로 내가 @POST를 사용하는 경우 @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; 
} 

null의 사용할 때 ID 값을 얻을 수 있지만, 애플리케이션 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 
} 

:

내가이 비디오를 따랐다.

사용하여 라이브러리

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 

업데이트

:

내가 "컴파일"하도록 변경하여 "제공"으로 설정 내 받는다는 번들에서 depedencies했다 MediaType.APPLICATION_FORM_URLENCODED가 작동합니다.

그러나 MediaType.MULTIPART_FORM_DATA는 여전히 다릅니다.

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

9 
--ARCFormBoundary5xbnwa6as8aor-- 

내가 @FormParam 값이 추가 순간 : 내가 @FormParam를 제거하면

Content-Type: multipart/form-data 

다음 ID가 가득 : 내 헤더는 형태의 포스트 동안

없는.

+0

다중 요청을 보내시겠습니까?일반 양식의 경우에는 그렇지 않습니다. 따라서 매개 변수가 자원에 의해 선택되는 것보다 정확합니다. –

+0

내 머리글 : Content-Type : multipart/form-data – SpikerTom

답변

4

JAX-RS 사양은 다중/폼 데이터를 처리하는 방법에 대해 아무 말도하지 않습니다. 서로 다른 JAX-RS 구현은이 문제를 처리 할 독점적 인 방법을 가지고 있습니다. 내가 아는 한, Apache Wink는 멀티 파트를위한 @FormParam을 지원하지 않습니다. 윅크 (Wink)의 복수 부분에 대한 지원 유형이 몇 가지 있습니다 : http://wink.apache.org/documentation/1.1.1/html/7.8%20MultiPart.html하지만이 클래스는 Amdatu Wink 번들에 의해 노출되지 않으며이 중 하나를 사용해 본 적이 없습니다.

내가 사용하는 임시 해결책은 아래 예입니다. 이 옵션은 멀티 파트를 사용하여 다른 양식 필드와 함께 파일을 업로드하는 경우 유용합니다 (다중 파트가 주로 사용되는 이유입니다). 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(); 
    } 
} 
+0

이것은 정말 간단하고 작동합니다, 폴 감사합니다! –

1

@Consumes에서 잘못된 Mediatype을 사용하고있는 것으로 보입니다.

@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> 
+0

여전히 null을 반환합니다. 설명에 라이브러리를 추가했습니다. 다른 건 필요해? – SpikerTom

관련 문제