0
votes

Comment définir le type de contenu pour un étui de test de démarrage à ressort qui retourne le fichier PDF

Je suis actuellement testant l'un de mes services avec le test de démarrage Spring.Le Service exporte toutes les données utilisateur et produit un CSV ou un PDF après une achèvement réussie. Un fichier est Downloade dans le navigateur.

ci-dessous est le code que j'ai écrit dans ma classe de test p> xxx pré>

ci-dessous est mon code de classe de ressources (appel vient à cet endroit) - p> xxx pré>

pendant que je déboque mon service et placez le débogage juste avant la sortie, je reçois le type de contenu comme "Application / PDF" et statut de 200.J'ai essayé de reproduire le Même type de contenu dans mon cas de test. D'une manière ou d'une autre, elle jette toujours en dessous de l'erreur lors de l'exécution - P>

   java.lang.AssertionError: Status 
   Expected :200
   Actual   :406


14 commentaires

Comme je vous l'avais dit en discussion: une heure est une courte période sur le débordement de la pile. Si vous voulez une réponse tôt, engagez un développeur. J'ai édité votre Précédent, une question en double exacte au moins avoir une déclaration de questions appropriée. La façon d'aller sur la pile trop-fleuve est alors d'attendre pendant que votre question passe dans la file d'attente de révision, non pas en abusant du système et simplement de la suppression et de la supprimer et de la retirer. Veuillez prendre en considération que tout le monde ici est un volontaire et tous sont égaux. Vous n'avez pas droit à une réponse en quelques minutes, c'est aux intervenants.


Oui, vous avez mis à jour la question précédente et j'ai été désespéré pour obtenir une réponse. Je suis au courant d'une heure n'est pas très long. Mais parfois, nous devons désespérés de terminer notre travail. Donc cela a causé ce gâchis.


Ce qui, comme je vous l'ai dit trois fois, ne nous préoccupe pas. Vous posez une question et les gens peuvent ou non faire du bénévolat pour vous aider. Abuser le système en spammant votre question aussi souvent que possible en vain espoir d'obtenir une réponse n'est pas tolérée. Vous devrez simplement vous asseoir et attendre une réponse. De meilleures questions Obtenez des réponses plus tôt, alors essayez d'améliorer votre question dans tous les aspects (langue, code, exemples, erreurs, etc.), et si vous ne recevez toujours pas de réponse après deux jours, vous pouvez mettre une prime à ce sujet. Si cela échoue, c'est comme ça que c'est alors.


bien. je vois ce que tu veux dire.


Remise complète @narendrapandey essayer contenttypecompatiblewith au lieu de contenttype


@Darren J'ai eu la réponse suivante après avoir changé contenttype à contenttypecompatiblewith - Type de contenu [Application / Problème + JSON] n'est pas compatible avec [Application / PDF]


Serait-il possible pour vous de fournir un exemple de travail produisant l'erreur? Quelque chose en tant que projet GITUB sera idéal. Il semble un problème avec la manière dont votre projet est mis en place. Partagez toute la configuration de printemps que vous avez.


@Veeram, va essayer de en fournir un. Merci


Quelle est votre version de dépendance Spring-webmvc et de jar à ressort?


Bonjour @veeram, la version Spring MVC est 5.0.5 et la version de démarrage à ressort est 2.0.1


ressemble à un duplicata de Stackoverflow.com/Questtions/33876635/...


@Jacobstl, oui, il l'a l'air identique. Je suis déjà en train de mettre en œuvre la solution donnée. Il semble que mon témoignage manque de quelque chose.


Je ne crois pas que votre cas de test manque de quoi que ce soit et je pense que c'est une exception ou une erreur quelque part au printemps ou à une autre bibliothèque que nous ne pouvons pas voir. Essayez de déboguer le code source de printemps dans lequel le type de média d'application / problème JSON est produit. Il sera utile de mettre en place un projet GitHub. Utilisez-vous un module de détail problématique comme Github.com/zalando/problem-spring-Web Cela produisent généralement le type de média JSON Problème?


@Veeram Bonjour Veeram, comme suggéré, j'ai débuté le code de printemps. et a appris à savoir que mapping2jacksonhttpmessageconverter a eu des valeurs de support par défaut I.e. Application / JSON & Application * \ JSON . Je remplace ces propriétés et je résout le problème. Merci de votre aide.


3 Réponses :


0
votes

406 signifie que votre client demande un contenu de contenu (probablement pdf) que le serveur ne pense pas qu'il puisse fournir.

Je suppose que votre code fonctionne lorsque vous avez débogué, c'est que votre client de repos n'ajout que l'en-tête accepté qui demande un PDF comme le code de test est.

Pour résoudre le problème, ajoutez à votre annotation @postTmapping produit = mediatype.application_pdf_value voir https://docs.spring.io/spring-framework/docs/current/javadoc-api /org/springframework/web/bind/annotation/postmapping.html#produces--


3 commentaires

Bonjour Jacobstl, j'ai fait les modifications nécessaires, mais je suis réactivé après l'erreur Java.lang.assertionError: Type de contenu attendu: Application / PDF réelle: Application / Problème + JSON . Je pense que nous n'avons utilisé aucun type de produit spécifique, car nous utilisons ce service pour télécharger les fichiers de type CSV PDF ANS.


Si vous souhaitez envoyer différents types de contenu en fonction de l'en-tête accepté, vous avez besoin de méthodes de contrôleur séparées, divisées par l'en-tête, voir docs.spring.io/spring-framework/docs/Current/javadoc-api/org /javadoc-api/org / ...


J'ai essayé avec la définition de la méthode de la ressource suivante, @postmapping (valeur = "/ comptes d'utilisateur / exportation", consomme = mediatype.application_json_value, produit = {mediatype.application_pdf_value, "text / csv"}) `mais toujours obtenir le code d'erreur HTTP 406. J'aimerais vérifier le type de réponse comme «Application / PDF», mais il s'agit de Application / Problème + JSON



5
votes

Vous avez un problème d'autre où d'autre. Il semble qu'une exception / une erreur survenue comme indiqué par l'application / problème + le type de contenu JSON. Ceci est probablement défini dans le gestionnaire d'exception. Comme votre client n'attend que l'application / pdf 406 est renvoyé.

Vous pouvez ajouter un cas de test pour lire les détails d'erreur pour savoir quelle est exactement l'erreur.

quelque chose comme xxx

aller de l'avant si vous attendez-vous à l'erreur que vous pouvez modifier le type d'acceptation pour inclure à la fois le type PDF et le type JSON.

Remarque - Ces comportements dépendent de la version Spring Web MVC que vous avez.

La dernière version de Spring MVC prend en compte l'en-tête Type de contenu défini dans l'entité de réponse et ignore ce qui est fourni dans l'en-tête accepté et analyse la réponse au format possible. Donc, le même test que vous ne récupère pas le code 406 permettrait de renvoyer le contenu avec le type de contenu de problème JSON d'application JSON.


5 commentaires

Comme vous l'avez mentionné dans votre note, ce retour dépendra de votre Web Spring Web MVC, pourriez-vous indiquer une référence DOC.Comment-on réellement tester dans ce cas? Je voudrais comparer le type de contenu de résultat final comme "Application / PDF"


Bonjour @veeram, j'ai suivi l'approche ci-dessus et j'ai trouvé l'erreur 406 avec un organe plus détaillé, c'est-à-dire {"Type": "http: // abc-aaa / problème / problème / problème-avec-un message", "TITRE" " : "Pas acceptable", "Statut": 406, "Détail": "Impossible de trouver une représentation acceptable", "Chemin": "/ API / Comptes d'utilisateur / Exportation", "Message": "ERROR.HTTP.406" }


Regardez le github Commentaires .Le type de résultat final Type de résultat n'est pas une application / pdf. C'est le problème. Comment définissez-vous le type de contenu? . Est-ce que cela fait partie de l'en-tête d'entité de réponse? Selon 5.0.5, vous ne devriez pas obtenir une erreur 406 si vous réglez le type de contenu dans l'en-tête et n'a pas de produit d'annotation.


L'en-tête est défini manuellement dans notre service de la manière suivante headers.setcontenttype (mediatype.parsemeatype ("application / pdf")); headers.setContentDispositionFormData ("nom de fichier", nom de fichier); Headers.setcachecontrol ("Must-revalidate, post-check = 0, pré-chèque = 0"); et a ensuite renvoyé la voie suivante retour Nouvelle réponse <> (sortieContents, en-tête, httpstatus.ok) ; .sutilisation du fichier de téléchargement dans notre navigateur. Mais dans l'exécution de cas d'essai, il est converti de HTTP.200 en 406 et Application / PDF à l'application / Problème + JSON


Bonjour Veeram, comme suggéré, j'ai débogué le code de printemps. et a appris à savoir que mapping2jacksonhttpmessageconverter a eu des valeurs de support par défaut I.e. Application / JSON & Application * \ JSON . Je remplace ces propriétés et je résout le problème. Merci de votre aide.



2
votes

J'ai trouvé la réponse avec l'aide de @veeram et je suis venu comprendre que ma configuration pour MappingJackson2HTTPMessagecverter code> manquait de mon exigence. Je remplace son paramètre CODE> MEDIATYPE CODE> ET IL TI RÉSOLU LE PREMIÈRE.

PRÉFAUT DE VALEUR - P>

@Autowired
private MappingJackson2HttpMessageConverter jacksonMessageConverter;

List<MediaType> mediaTypes = new ArrayList<>();
mediaTypes.add(MediaType.ALL);
jacksonMessageConverter.setSupportedMediaTypes(mediaTypes);


0 commentaires