web-dev-qa-db-fra.com

"Impossible de trouver une représentation acceptable" avec spring-boot-starter-web

J'essaie d'utiliser spring-boot-starter-web pour créer un service de repos servant des représentations JSON d'objets Java. D'après ce que j'ai compris, ce fichier jar boot-starter-web est supposé gérer automatiquement la conversion au format JSON via Jackson, mais je reçois plutôt cette erreur.

{ "timestamp": 1423693929568,
  "status": 406,
  "error": "Not Acceptable",
  "exception": "org.springframework.web.HttpMediaTypeNotAcceptableException",
  "message": "Could not find acceptable representation"
}

Mon contrôleur est-ce ...

@RestController
@RequestMapping(value = "/media")
public class MediaController {
    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public @ResponseBody UploadResult test(@RequestParam(value="data") final String data) {
      String value = "hello, test with data [" + data + "]"; 
      return new UploadResult(value);
    }

    @RequestMapping(value = "/test2", method = RequestMethod.POST)
    public int test2() {
        return 42;
    }

    @RequestMapping(value = "/test3", method = RequestMethod.POST)
    public String test3(@RequestParam(value="data") final String data) {
        String value = "hello, test with data [" + data + "]"; 
        UploadResult upload = new UploadResult(value);
        return upload.value;
    }


    public static class UploadResult {
        private String value;
        public UploadResult(final String value)
        {
            this.value = value;
        }
    }
}

Mon pom.xml a ...

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.2.1.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-Tomcat</artifactId>
        <version>1.2.1.RELEASE</version>
        <scope>provided</scope>
    </dependency>

mvn dependency:tree montre que spring-boot-starter-web dépend en effet de l'attribut jackson2.4 databind et qu'il doit donc figurer sur le chemin de classe ...

[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:1.2.1.RELEASE:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:1.2.1.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot:jar:1.2.1.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-autoconfigure:jar:1.2.1.RELEASE:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:1.2.1.RELEASE:compile
[INFO] |  |  |  +- org.slf4j:jul-to-slf4j:jar:1.7.8:compile
[INFO] |  |  |  \- org.slf4j:log4j-over-slf4j:jar:1.7.8:compile
[INFO] |  |  \- org.yaml:snakeyaml:jar:1.14:runtime
[INFO] |  +- com.fasterxml.jackson.core:jackson-databind:jar:2.4.4:compile
[INFO] |  |  +- com.fasterxml.jackson.core:jackson-annotations:jar:2.4.0:compile
[INFO] |  |  \- com.fasterxml.jackson.core:jackson-core:jar:2.4.4:compile
[INFO] |  +- org.hibernate:hibernate-validator:jar:5.1.3.Final:compile
[INFO] |  |  +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] |  |  +- org.jboss.logging:jboss-logging:jar:3.1.3.GA:compile
[INFO] |  |  \- com.fasterxml:classmate:jar:1.0.0:compile
[INFO] |  +- org.springframework:spring-web:jar:4.1.4.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-aop:jar:4.1.4.RELEASE:compile
[INFO] |  |  |  \- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  |  +- org.springframework:spring-beans:jar:4.1.4.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-context:jar:4.1.4.RELEASE:compile
[INFO] |  \- org.springframework:spring-webmvc:jar:4.1.4.RELEASE:compile
[INFO] |     \- org.springframework:spring-expression:jar:4.1.4.RELEASE:compile

... mais l'appel du service test donne l'erreur mentionnée ci-dessus. test2 et test3 fonctionnent bien, ce qui prouve qu'il doit s'agir simplement d'une tentative de conversion en JSON qui échoue? Me manque-t-il un problème de configuration ou des annotations? Parmi tous les exemples que je peux trouver, l'annotation de la classe pour la conversion de base JSON de Jackson n'est plus nécessaire.

Toute aide grandement appréciée.

39
crowmagnumb

Vous n'avez pas de getters publics pour votre UpdateResult, par exemple:

public static class UploadResult {
    private String value;
    public UploadResult(final String value)
    {
        this.value = value;
    }

    public String getValue() {
       return this.value;
    }
}

Je pense que, par défaut, la découverte automatique est activée et que je vais essayer de découvrir vos accesseurs. Vous pouvez le désactiver avec @JsonAutoDetect(getterVisibility=Visibility.NONE), et dans votre exemple, vous obtiendrez [].

60
ikumen

J'ai eu une erreur similaire en utilisant le service spring/jhipster RESTful (via Postman)

Le point final était quelque chose comme:

@RequestMapping(value = "/index-entries/{id}",
        method = RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<IndexEntry> getIndexEntry(@PathVariable Long id) {

J'essayais d'appeler le noeud final restful via Postman avec l'en-tête Accept: text/plain mais je devais utiliser Accept: application/json

9
wired00

Moi aussi, je faisais face à un problème similaire. Dans mon cas, le chemin de la demande acceptait mail id en tant que variable de chemin, ainsi l'uri ressemblait à /some/api/[email protected]

Et basé sur le chemin, Spring a déterminé que l’URI était de récupérer un fichier avec l’extension ".com" et essayait d’utiliser un type de média différent pour la réponse, puis celle voulue. Après avoir transformé le chemin variable en paramètre de requête, cela a fonctionné pour moi.

4
Kranthi Kiran

Mon objet de retour n'avait pas d'annotation @XmlRootElement sur la classe. L'ajout de l'annotation a résolu mon problème.

@XmlRootElement(name = "ReturnObjectClass")
public class ReturnObjectClass {

    @XmlElement(name = "Status", required = true)
    protected StatusType status;
    //...
}
2
Vasudev

Si vous utilisez @FeignClient, ajoutez par exemple.

produces = "application/json"

à l'annotation @RequestMapping

2
charlb

la réponse acceptée n’est pas correcte avec Spring 5. Essayez de changer l’URL de votre service Web en .json! c'est la bonne solution. grands détails ici/ http://stick2code.blogspot.com/2014/03/solved-orgspringframeworkwebhttpmediaty.html

0
tom

Je devais appeler explicitement la dépendance de ma bibliothèque json dans mon POM.

Une fois que j'ai ajouté la dépendance ci-dessous, tout a fonctionné.

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
</dependency>
0
thernandez

J'avais la même exception mais la cause était différente et je ne pouvais trouver aucune information à ce sujet. Ce n'était qu'une simple erreur de négligence.

Mal:

@RestController(value = "/api/connection")

Bien:

@RestController
@RequestMapping(value = "/api/connection")
0
Dominik H.