2015-08-25 1 views
1

Nous prévoyons d'utiliser la négitiation de type de contenu comme une forme de versioning pour notre API de repos, mais il semble plus complexe qu'elle ne devrait l'être. Vu le code exemple follwing:Existe-t-il un moyen simple de résoudre la négociation de contenu dans Spring boot

@RestController 
@RequestMapping("/products") 
ProductController { 
....... 
@RequestMapping(value = "/{productID}", method = RequestMethod.GET, produces = "productVersion2/json") 
public ResponseEntity<ProductV2> getVersion2(@PathVariable String productID) { 
....... 
return new ResponseEntity<ProductV2>(product, HttpStatus.OK); 

La bonne méthode est appelée lorsque le test de ce facteur par exemple, mais je reçois un HTTP 406 Non acceptable comme réponse. J'ai cherché plusieurs endroits, mais je n'ai pas trouvé une page avec une bonne explication de ce que je dois faire pour que cela fonctionne.

La réponse doit être analysée avec json comme toutes les autres demandes, mais l'objet réponse est modifié. L'idée est que, ce faisant, nous pouvons prendre en charge plusieurs "versions" de la même API et que nous pouvons progressivement faire passer les clients à la nouvelle API, tout en ayant toujours accès à la même uri/ressource. Est-ce que n'importe qui peut pointer vers un bon tutirial ou un guide étape par étape de la façon dont ceci peut être résolu dans la botte de ressort?

J'ai lu cet article: http://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc/#combined-controller mais je n'a pas pu obtenir une anderstanding claire de ce qui était nécessaire pour le faire fonctionner

+0

Avez-vous un en-tête 'Accept: productVersion2/json' dans la requête envoyée via Postman? –

+0

oui je fais. Et comme mentionné, l'appel est dirigé vers la méthode correcte dans le contrôleur, mais il échoue dans le dernier appel de méthode lorsque je tente de retourner nouvelle ResponseEntity (produit, HttpStatus.OK); –

Répondre

1

Votre type de support est erroné. Pour utiliser des types de média personnalisés pour la gestion des versions de l'API, vous pouvez utiliser application/productVersion2+json au lieu de productVersion2/json. Je suppose que vous obtenez le 406 parce que Spring Boot n'a aucun moyen de savoir comment sérialiser votre objet en JSON car productVersion2/json n'est pas un type de média valide pour les données json.

Il y a plus d'une façon de choisir un type de support pour faire ceci, j'ai googlé un document plus complet here.

+0

Merci beaucoup. Ca fonctionne maintenant :) frustrant que quelque chose d'aussi simple puisse m'arrêter, mais franchement je n'ai pas trouvé beaucoup de ressources décrivant ce problème. Super articlle vous avez trouvé par le chemin. Partagé avec un buch de colegues au travail :) –