2012-04-20 3 views
1

JPG 파일과 JSON 직렬화 된 Java 객체를 업로드하려고합니다. 서버에서 Apache CXF를 사용하고 있는데, 클라이언트에서 나는 rest-assured으로 통합 테스트를하고 있습니다. 내가 처음 멀티 라인에서와 같이 파일에서 JSON 부분을 읽을 때JAX-RS with CXF/rest-assured : 다중 경로 파일 업로드 처리

given(). 
    multiPart("document", new File("./data/json.txt"), "application/json"). 
    multiPart("image", new File("./data/image.txt"), "image/jpeg"). 
expect(). 
    statusCode(Response.Status.CREATED.getStatusCode()). 
when(). 
    post("/document"); 

모든 것이 잘 작동 :

@POST 
@Path("/document") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response storeTravelDocument(
     @Context UriInfo uriInfo, 
     @Multipart(value = "document") JsonBean bean, 
     @Multipart(value = "image") InputStream pictureStream) 
     throws IOException 
{} 

내 클라이언트 코드는 다음과 같습니다처럼

내 서버 코드 보인다. 그러나 json 인스턴스를 직렬화하려면 문제가 발생합니다. 나는 많은 변종을 시도했지만 아무도 효과가 없었다.

내가이 변형이 일을해야한다고 생각 : 클라이언트

JsonBean json = new JsonBean(); 
json.setVal1("Value 1"); 
json.setVal2("Value 2"); 

given(). 
    contentType("application/json"). 
    formParam("document", json). 
    multiPart("image", new File("./data/image.txt"), "image/jpeg"). 
... 

에 서버

public Response storeTravelDocument(
    @Context UriInfo uriInfo, 
    @FormParam(value = "document") JsonBean bean, 
    @Multipart(value = "image") InputStream pictureStream) 

에 있지만. 아무도 그것이 어떻게되어야하는지 말해 줄 수 있습니까?

답변

0

멀티 파트/양식 데이터는 멀티 파트 MIME 데이터 스트림의 규칙을 따르며, w3.org을 참조하십시오. 이는 요청의 각 부분이 스트림에 일부를 형성 함을 의미합니다. 안심은 이미 간단한 필드 (문자열), 파일 및 스트림을 지원하지만 객체 직렬화는 지원하지 않습니다. 메일 링리스트에 묻자 Johan Haleby (안심 저자)는 문제를 추가 할 것을 제안했습니다. 문제는 이미 승인되었습니다 (issue 166 참조). 그대로

서버가있을 것입니다 :

given(). 
    multiPartObject("document", objectToSerialize, "application/json"). 
    multiPart("image", new File("./data/image.txt"), "image/jpeg"). 
expect(). 
    statusCode(Response.Status.CREATED.getStatusCode()). 
when(). 
    post("/document"); 

아마 이름 "multiPartObject는"변경됩니다 : 같은

@POST 
@Path("/document") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public Response storeTravelDocument(
     @Context UriInfo uriInfo, 
     @Multipart(value = "document") JsonBean bean, 
     @Multipart(value = "image") InputStream pictureStream) 
     throws IOException 
{} 

클라이언트 코드가 보일 것이다. 일단 구현되면 보게 될 것입니다.

1

다른 방법을 시도해보십시오 (저에게 도움이 됨). 귀하의 경우에 적합한 지 확실하지 않습니다.

JsonBean을 클래스 정의 위에 @XmlRootEntity를 추가하는 JAXB 엔터티로 만듭니다. 대신

given(). 
    contentType("application/json"). 
    body(bean). //bean is your JsonBean 
    multiPart("image", new File("./data/image.txt"), "image/jpeg"). 

formParam

그런 다음, 다음

public Response storeTravelDocument(
    @Context UriInfo uriInfo, 
    JsonBean bean, //should be deserialized properly 
    @Multipart(value = "image") InputStream pictureStream) 

나는 @Multipart 부분하지만, 함께 희망 작동 것이라고 한 번도 안 써봤.

+0

도움 주셔서 감사합니다. 이전에 시도했는데 (JAXB가 아닌, 작동하지 않음) 멀티 파트와 본문을 함께 사용할 수 없습니다. 작동하지 않는 이유는 http://code.google.com/p/rest-assured/issues/ 일 수 있습니다. detail? id = 167 우리는 다음 버전의 안심할 것입니다. – ChrLipp

+0

불운 한 다음 :(미안하지만 도움이되지 못합니다.) –

+0

아무튼 고맙습니다! – ChrLipp