2012-04-20 6 views
1

Я хочу загрузить файл JPG и JSON-сериализованный Java-объект. На сервере я использую Apache CXF, на клиенте - интеграционное тестирование с rest-assured.JAX-RS с CXF/rest-sure: Обработка загрузки многофайлового файла

Мой код сервера выглядит следующим образом:

@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 
{} 

Мой клиент код выглядит следующим образом:

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"); 

Все отлично работает, когда я прочитал JSon часть из файла, как и в первой MULTIPART линии. Однако, когда я хочу сериализовать экземпляр 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

Multipart/form-data следует правилам многоточечных потоков данных MIME, см. w3.org. Это означает, что каждая часть запроса формирует часть потока. Rest-assured поддерживает уже простые поля (строки), файлы и потоки, но не сериализацию объектов в часть. После запроса в списке рассылки Йохан Халеби (автор уверенности в завтрашнем дне) предложил добавить вопрос. Вопрос уже принят, см. issue 166.

Сервер будет оставаться как есть:

@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 
{} 

клиентский код будет выглядеть следующим образом:

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" изменится. Мы увидим, как только оно будет реализовано.

1

Попробуйте другой подход (работал для меня), я не уверен, подходит ли это в вашем случае.

Сделайте JsonBean сущностью JAXB, добавив @XmlRootEntity над определением класса.

Тогда вместо formParam

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

затем

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

Я никогда не пробовал, что с @Multipart части, но, надеюсь, он будет работать.

+0

Благодарим за помощь! Пробовал это раньше (не с JAXB, но не работал. Вы не можете смешивать тело с multiPart. Причина, по которой он не работает, также может быть http://code.google.com/p/rest-assured/issues/ detail? id = 167, который мы увидим в следующей версии покоя. – ChrLipp

+0

Не повезло :(извините, что не смог помочь. –

+0

Нет проблем! Спасибо в любом случае! – ChrLipp