wake-up-neo.com

"Konnte keine akzeptable Darstellung finden" mit Spring-Boot-Starter-Web

Ich versuche, spring-boot-starter-web zu verwenden, um einen Rest-Service zu erstellen, der JSON-Repräsentationen von Java-Objekten bereitstellt. Nach meinem Verständnis soll dieser Boot-Starter-Web-Jar die Konvertierung in JSON durch Jackson automatisch abwickeln, aber ich bekomme stattdessen diesen Fehler.

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

Mein Controller ist das ...

@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;
        }
    }
}

Mein pom.xml hat ...

    <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 zeigt, dass spring-boot-starter-web tatsächlich von der jackson2.4-Datenbank abhängig ist und daher auf dem Klassenpfad stehen sollte ...

[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

... der Aufruf des Dienstes test führt jedoch zu dem oben genannten Fehler. test2 und test3 funktionieren einwandfrei, um zu beweisen, dass es nur der Versuch der Konvertierung in JSON ist, der fehlschlägt? Fehlen mir Konfigurationsprobleme oder Anmerkungen? Von allen Beispielen, die ich finden kann, ist das Kommentieren der Klasse für die grundlegende Jackson JSON-Konvertierung nicht mehr erforderlich.

Jede Hilfe sehr geschätzt.

39
crowmagnumb

Sie haben keine öffentlichen Getter für Ihr UpdateResult, zum Beispiel:

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

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

Ich glaube, dass die automatische Erkennung standardmäßig aktiviert ist und versuchen wird, Ihre Getter zu ermitteln. Sie können es mit @JsonAutoDetect(getterVisibility=Visibility.NONE) deaktivieren und in Ihrem Beispiel [] ergeben.

60
ikumen

Ich hatte einen ähnlichen Fehler bei der Verwendung von spring/jhipster RESTful (über Postman).

Der Endpunkt war so etwas wie:

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

Ich habe versucht, den Endpunkt restful über Postman mit dem Header Accept: text/plain aufzurufen, musste jedoch Accept: application/json verwenden.

9
wired00

Auch ich stand vor einem ähnlichen Problem. In meinem Fall akzeptierte der Anforderungspfad die Mail-ID als Pfadvariable, sodass der URI wie .__ aussah. /some/api/[email protected]

Aufgrund des Pfads stellte Spring fest, dass der URI eine Datei mit der Erweiterung ".com" abruft und versuchte, einen anderen Medientyp als Antwort zu verwenden, als beabsichtigt. Nachdem ich path variable in request param gemacht hatte, funktionierte es für mich.

4
Kranthi Kiran

Mein Rückkehrobjekt hatte keine @XmlRootElement-Annotation für die Klasse. Durch das Hinzufügen der Anmerkung wurde mein Problem behoben.

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

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

Wenn Sie @FeignClient verwenden, fügen Sie z.

produces = "application/json"

in der @RequestMapping-Anmerkung

2
charlb

In meinem Fall habe ich zufällig Lombok verwendet und anscheinend gibt es Konflikte mit get und set

die akzeptierte Antwort stimmt nicht mit Spring 5 überein. Versuchen Sie, die URL Ihres Webservices in .json zu ändern. das ist die richtige Lösung. tolle Details hier http://stick2code.blogspot.com/2014/03/solved-orgspringframeworkwebhttpmediaty.html

0
tom

Ich musste die Abhängigkeit für meine Json-Bibliothek in meinem POM explizit angeben.

Nachdem ich die unten genannte Abhängigkeit hinzugefügt hatte, funktionierte alles.

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

Add Below-Abhängigkeit:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.4.6</version>
</dependency>
0

Ich hatte die gleiche Ausnahme, aber die Ursache war anders und ich konnte keine Informationen dazu finden, also werde ich sie hier posten. Es war einfach ein Fehler zu übersehen.

Schlecht:

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

Gut:

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

Fügen Sie über der Pojo-Klasse, die Sie deserialisieren möchten, eine @ Data-Annotation hinzu. Das Problem ist für mich gelöst :)

Zum Beispiel,

    import lombok.Data;

    @Data
    public class Response {
    private Integer status;
    private String type;
    }
0