Jaxrs multipart
Estou tentando executar uma solicitação para um serviço jaxrs que tem o tipo de mídia definido comomultipart/form-data
. Esta solicitação contém uma lista de entidades (xml) e uma imagem (png, binário). Eu criei o pedido conforme descrito emisto fio pela BalusC.
O pedido parece ok depois de inspecioná-lo no wireshark, com exceção do checksum ip checksum estar errado (diz algo sobre "pode ser causado por offload de checksum IP").
Meu grande problema aqui é como lidar com a solicitação de multipartes no lado do serviço. Eu não quero incluir nenhuma biblioteca de apache.cxf, resteasy ou qualquer coisa do tipo. Tudo o que eu quero confiar é o jaxrs api.
As duas partes no pedido têm nomesdeliveries
esignature
, onde a assinatura é um arquivo de imagem png enviado como binário. A lista de entregas deve ser analisada a partir de um xml (a entidade tem oxmlrootelement
anotação e tal, então esta parte funciona separadamente). Eu tentei com este modo de ler as partes diferentes, mas isto foi realmente um longo caminho;
@PUT
@Path("signOff")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void signOffDeliveries(@FormParam("deliveries") List<Delivery> deliveries, @FormParam("signature")File signature) {
//do something with the signature(image) and the list of deliveries.
}
Isso obviamente não funciona, e me fornece um código de status HTTP 404 se eu executar a solicitação no Websphere e um 415 quando eu executar a solicitação para um openejb integrado (em nossa estrutura de teste de integração). Se eu remover oFormParam
anotações a solicitação é bem-sucedida.
Como posso ler as diferentes partes da solicitação multipartes usando apenas o jaxrs api?
EDITAR Ok, então eu forcei oPUT
paraPOST
e adicionou um@Encoding
anotação para os params como assim:
@POST
@Path("signOff")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void signOffDeliveries(
@Encoded @FormParam("deliveries") String deliveries,
@Encoded @FormParam("signature") File signature) {
}
Agora eu recebo o xml como uma string de texto, mas não consigo desmembrá-lo automaticamente para uma lista de entregas, mesmoContent-Type
desta parte da carga está definido paraapplication/xml
. O outro problema é que o arquivo que recebo tem comprimento == 0 e não consigo ler nenhum byte dele.
Estou perdendo um ponto essencial aqui?