10
votes

JAXRS Multipart

J'essaie d'effectuer une demande à un service JAXRS qui a un type de support défini sur Multipart / Form-Data ​​Code>. Cette demande contient une liste d'entités (XML) et une image (png, binaire). J'ai créé la demande décrite dans ce thread de Balusc.

La demande semble correcte après l'inspection dans Wireshark, à l'exception de la somme de contrôle d'en-tête IP étant fausse. (dit que quelque chose à propos de "peut être causé par la déchargement de la somme de contrôle IP".) p>

Mon gros problème ici est comment Pour gérer la demande de multipart sur le côté du service. Je ne souhaite pas inclure de bibliothèques d'Apache.cxf, Reseastant ou quoi que ce soit du genre. Tout ce que je veux compter sur est l'API JAXRS. p>

Les deux parties de la demande ont des noms livraisons code> et Signature code>, où la signature est un fichier image PNG envoyé sous forme de binaire. La liste des livraisons doit être analysée d'une XML (l'entité dispose de l'annotation xmlrootelement code> et telle, donc cette pièce fonctionne séparément). J'ai tenté de cette façon de lire les différentes parties, mais c'était vraiment un long terni; p> xxx pré>

ceci ne fonctionne pas bien sûr, et cela me donne un statut HTTP 404 CODE Si j'exécute la requête sur WebSphere et un 415 lorsque j'exécute la demande en vue d'une openejb intégrée (dans notre cadre de test d'intégration). Si je supprimais les annotations code> FORMPARAM code> La demande réussit. P>

Comment puis-je lire les différentes parties de la demande de multipartite en utilisant uniquement l'API de JAXRS? P>

edit strong> OK, j'ai annulé donc le mettre code> à post code> et a ajouté un @encoding code> annotation aux paramètres suivants: p>

@POST
@Path("signOff")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void signOffDeliveries(
    @Encoded @FormParam("deliveries") String deliveries,
    @Encoded @FormParam("signature") File signature) {

}


1 commentaires

La spécification ne fournit rien de ce cas. Mais JaxRS est basé sur l'API de servlet. Avec API de servlet, vous pouvez accéder au corps de la demande et le transférer à Apache Commons Filedupload Library Commons.apache.org / approprié / Commons-Filedupload . Cela n'est pas contrairement à la mise en œuvre de JAXRS.


3 Réponses :


-2
votes

Je ne souhaite pas inclure de bibliothèques d'Apache.cxf, reseastant ou quoi que ce soit du genre. Tout ce que je veux compter sur est l'API JAXRS

Vous ne pouvez pas "compter sur" l'API, car il ne contient que des interfaces. Classes qui mettent en œuvre que les interfaces proviennent de ReSease, ou de Jersey ou CXF.

et un 415 lorsque je manipule la demande vers une openejb intégrée

415 signifie "méthode non prise en charge", ce qui se produit lorsque vous envoyez une demande d'accès à une ressource en attente.

Je recommanderais d'utiliser Post au lieu de mettre dans ce cas. Je soupçonne que @formparam ne convient pas à travailler avec mis, dans votre cas particulier.


1 commentaires

Je sais que l'API n'est que des interfaces, mais tant que je n'inclut aucune référence aux implémentations spécifiques Apache CXF, je devrais pouvoir modifier le conteneur sans avoir beaucoup de problèmes. Cependant, la modification de la méthode à un poste ne fait rien.



8
votes

En effet, j'ai du mal à comprendre pourquoi la spécification JAX-RS ne stimule pas un support pour cela (je viens de créer https://java.net/jira/browse/jax_rs_spec-413 pour résoudre ce problème).

Cependant, il est néanmoins possible de prendre en charge des formes de plusieurs pièces dans une mode de mise en œuvre indépendante. Soit vous écrivez votre propre message de messagerie pour le formulaire de multipart ou vous utilisez une bibliothèque comme Apache Cleezza JaxRs.utils qui fournissent un objet MultiPartbody qui respecte MesmentbodyReader. Cette bibliothèque n'a pas de dépendance de la spécification de mise en œuvre afin que votre demande s'exécutera sur une implémentation JAX-RS.

Pour un exemple sur la façon dont Clereza JaxRs.utils est utilisé, voir la ligne 105 dans http://svn.apache.org/viewvc/stanbol/trunk/development/archetypes/statoire -WebModule / src / Main / Ressources / ArcheType-Ressources / SRC / Main / Java / MultiChancer.java? Révision = 1465777 & View = Markup . Si vous n'utilisez pas OSGI (avec l'enregistrement de la carte blanche des ressources), vous devrez ajouter à Org.apache.Clerezezza.jaxRS.UTILS.FORM.MULTIPARTFORMESAGEDOREDORED à votre application.


2 commentaires

D'où vient le problème de Jira après que Java.net a-t-il été fermé?


On dirait que le problème de Jira a été migré vers Github.com/eclipse-ee4j/jaxRs- API / Problèmes / 418



1
votes

Je l'ai mis en œuvre dans Glassfish 4 sans coupler avec Jersey. @see Cet article pour plus de détails


0 commentaires